5

XInclude を使用して結合された xml ドキュメントを作成し、JAXB 経由で非整列化しようとしています。

ここに私のアンマーシャリングコードがあります:

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

これが私のメインの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>

そしてincluded.xml:

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

実際に非整列化するために、xml ファイルへのパスを使用して新しいファイルを作成しFileReaderます (path-to-xml-files/main.xml - メイン ファイルを明確に見つけることができるため、パスは正しいです)。ただし、実行すると、含まれているファイルに問題があります。リンクされた SAXParseException で UnmarshalException が発生し、次のエラー メッセージが表示されます: XML ファイルの解析中にエラーが発生しました (href='path-to-xml-files/included.xml')。

included.xml のコンテンツを main.xml に手動でマージすると、問題なく実行されます。

JAXB の問題なのか XInclude の問題なのかはわかりませんが、後者の可能性が高いと思われます。

私は何が欠けていますか?

4

2 に答える 2

2

このまったく同じ問題と3時間格闘し、最終的にこれを見つけました:

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

つまり、次の行を追加する必要があります。

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

于 2013-09-19T23:10:08.737 に答える