2013-06-04 58 views
5

Tôi đang cố gắng tạo một tài liệu xml kết hợp bằng cách sử dụng XInclude để được unmarshalled thông qua JAXB."Lỗi khi phân tích cú pháp tệp XML" khi phân tích cú pháp bằng cách sử dụng XInclude

Đây là mã unmarshalling tôi:

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

Đây là chính tập tin xml của tôi:

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

Và included.xml:

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

Để thực unmarshal nó, Tôi tạo một FileReader mới với đường dẫn đến tệp xml của tôi (path-to-xml-files/main.xml - đường dẫn là cor rect vì nó có thể tìm thấy tập tin chính rõ ràng). Tuy nhiên, khi tôi chạy nó, có sự cố với tệp được bao gồm. Tôi nhận được một UnmarshalException với một SAXParseException liên kết với thông báo lỗi này: Lỗi cố gắng phân tích cú pháp tệp XML (href = 'path-to-xml-files/include.xml').

Khi tôi kết hợp thủ công nội dung của tệp include.xml vào tệp main.xml, nó sẽ chạy không có vấn đề gì.

Tôi không thể biết đó là vấn đề JAXB hay vấn đề XInclude, mặc dù tôi thực sự nghi ngờ vấn đề này.

Tôi đang thiếu gì?

Trả lời

2

tôi đã chiến đấu với cùng một vấn đề này chính xác trong ba giờ và cuối cùng tôi thấy điều này:

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

Nói tóm lại, bạn cần phải thêm dòng sau:

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

+1

URL này không tồn tại ... có lẽ bạn có thể tham khảo các nguồn chính thức: http://xerces.apache.org/xerces2-j/features.html – devyndraen

+0

Tôi có cách tiếp cận tương tự và thiết lập tính năng SaxParserFactory 'http: // apache.org/xml/features/xinclude/fixup-base-uris' thành false không giúp được gì ở đây. Bất cứ ai khác đã thành công với điều này? –

0

Tôi gặp vấn đề tương tự. Trên thực tế, các thuộc tính href hy vọng một URI, đó có thể là:

  • Hoặc một địa chỉ HTTP (có nghĩa là XML bao gồm của bạn phải được lưu trữ ở đâu đó)
  • Hoặc một tập tin trên máy tính địa phương của bạn. Nhưng trong trường hợp đó, bạn cần thêm tiền tố vào nó bằng "file: ..." và cung cấp đường dẫn tuyệt đối.

Với ví dụ của bạn:

<?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> 
Các vấn đề liên quan