xml-parsing jaxb xinclude

xml parsing - "Error al intentar analizar el archivo XML" al analizar usando XInclude



xml-parsing jaxb (2)

Intento crear un documento xml combinado utilizando XInclude para desasignarlo a través de JAXB.

Aquí está mi código de desmaquillaje:

@Override public T readFromReader(final Reader reader) throws Exception { final Unmarshaller unmarshaller = createUnmarshaller(); final SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setXIncludeAware(true); spf.setNamespaceAware(true); //spf.setValidating(true); final XMLReader xr = spf.newSAXParser().getXMLReader(); final SAXSource source = new SAXSource( xr, new InputSource(reader) ); try { final T object = (T) unmarshaller.unmarshal(source); postReadSetup(object); return object; } catch (final Exception e) { throw new RuntimeException("Cannot parse XML: Additional information is attached. Please ensure your XML is valid.", e); } }

Aquí está mi archivo xml principal:

<?xml version="1.0" encoding="UTF-8" ?> <tag1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="path-to-schema/schema.xsd"> <xi:include href="path-to-xml-files/included.xml"></xi:include> </tag1>

Y included.xml:

<?xml version="1.0" encoding="UTF-8"?> <tag2> Some text </tag2>

Para realmente desempaquetarlo, creo un nuevo FileReader con la ruta a mi archivo xml (path-to-xml-files / main.xml - la ruta es correcta porque puede encontrar claramente el archivo principal). Cuando lo ejecuto, sin embargo, hay algo mal con el archivo incluido. Obtengo una excepción UnmarshalException con una SAXParseException vinculada con este mensaje de error: Error al intentar analizar el archivo XML (href = ''path-to-xml-files / included.xml'').

Cuando fusiono manualmente el contenido de included.xml en main.xml, se ejecuta sin problemas.

No puedo decir si es un problema JAXB o un problema XInclude, aunque sospecho fuertemente esto último.

¿Qué me estoy perdiendo?



Yo tuve exactamente el mismo problema. En realidad, el atributo href espera un URI, que puede ser:

  • O bien una dirección HTTP (lo que significa que su XML incluido debe estar alojado en alguna parte)
  • O un archivo en su máquina local. Pero en ese caso, debe prefijarlo con "file: ..." y proporcionar la ruta absoluta.

Con tu ejemplo:

<?xml version="1.0" encoding="UTF-8" ?> <tag1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="path-to-schema/schema.xsd"> <xi:include href="file:absolute-path-to-xml-files/included.xml"/> </tag1>