2013-06-04 19 views
5

Próbuję utworzyć połączony dokument XML za pomocą XInclude, aby usunąć go z pamięci przez JAXB."Błąd podczas próby przeanalizowania pliku XML" podczas analizowania za pomocą XInclude

Oto mój kod unmarshalling:

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

Tu jest mój główny plik 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> 

I included.xml:

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

Aby rzeczywiście unmarshal go, Tworzę nowy FileReader ze ścieżką do mojego pliku xml (path-to-xml-files/main.xml - ścieżka jest cor rect, ponieważ może wyraźnie znaleźć główny plik). Kiedy go uruchomię, jest jednak coś nie tak z dołączonym plikiem. Otrzymuję wyjątek UnmarshalException z połączonym wyjątkiem SAXParseException z następującym komunikatem o błędzie: Błąd podczas próby przeanalizowania pliku XML (href = 'path-to-xml-files/included.xml').

Kiedy ręcznie scalam zawartość pliku included.xml do pliku main.xml, działa bez żadnych problemów.

Nie mogę stwierdzić, czy jest to problem JAXB, czy problem XInclude, choć podejrzewam to drugie.

Czego mi brakuje?

Odpowiedz

2

Walczyłem z dokładnym tego samego problemu przez trzy godziny i wreszcie znalazłem to:

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

Krótko mówiąc, trzeba dodać następujący wiersz:

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

+1

Ten adres URL nie istnieje ... może można odwoływać się do oficjalnego źródła: http://xerces.apache.org/xerces2-j/features.html – devyndraen

+0

Mam to samo podejście i ustawienie funkcji "http: // apache.org/xml/features/xinclude/fixup-base-uris" na false nie pomogło tutaj. Ktoś, kto odniósł z tym sukces? –

0

Miałem dokładnie ten sam problem. Właściwie atrybut href oczekuje URI, które mogą być:

  • Albo adres HTTP (co oznacza, że ​​zawarte XML musi znajdować się gdzieś)
  • lub pliku na komputerze lokalnym. Ale w takim przypadku musisz poprzedzić go "file: ..." i podać bezwzględną ścieżkę.

Z Twojego przykład:

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