2013-06-04 11 views
5

Sto tentando di creare un documento XML combinato utilizzando XInclude per essere non riparato tramite JAXB."Errore nel tentativo di analizzare il file XML" durante l'analisi utilizzando XInclude

Ecco il mio codice deserializzazione:

@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); 
    } 
} 

Qui è la mia principale file xml:

<?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> 

E included.xml:

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

Per unmarshal in realtà, Creo un nuovo FileReader con il percorso del mio file xml (path-to-xml-files/main.xml - il percorso è cor rect perché può trovare chiaramente il file principale). Quando lo eseguo, tuttavia, c'è qualcosa di sbagliato nel file incluso. Sto ottenendo un UnmarshalException con una SAXParseException collegata con questo messaggio di errore: Errore nel tentativo di analizzare il file XML (href = 'percorso-xml-files/included.xml').

Quando unisco manualmente il contenuto di included.xml in main.xml, viene eseguito senza problemi.

Non riesco a capire se si tratta di un problema JAXB o XInclude, sebbene sospetti fortemente quest'ultimo.

Cosa mi manca?

risposta

2

Ho lottato con questo problema esattamente lo stesso per tre ore e alla fine ho trovato questo:

xerces.apache.org/xerces2-j/features.html

In breve, è necessario aggiungere la seguente riga:

spf.setFeature (" http://apache.org/xml/features/xinclude/fixup-base-uris ", falso);

+1

Questo URL non esiste ... forse si potrebbe fare riferimento alla fonte ufficiale: http://xerces.apache.org/xerces2-j/features.html – devyndraen

+0

Ho lo stesso approccio e l'impostazione della caratteristica SaxParserFactory 'http: // apache.org/xml/features/xinclude/fixup-base-uris' su false non ha aiutato qui. Qualcun altro che ha avuto successo con questo? –

0

Ho avuto lo stesso identico problema. In realtà, l'attributo href si aspetta un URI, che può essere:

  • un indirizzo HTTP (il che significa che il vostro XML incluso devono essere ospitati da qualche parte)
  • o in un file sul computer locale. Ma in tal caso, è necessario prefisso con "file: ..." e fornire il percorso assoluto.

Con il vostro esempio:

<?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>