4

xinclude を使用して xml ファイルを Java オブジェクトに非整列化しようとしています。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 InputSource inputSource = new InputSource(reader);
    xr.parse(inputSource)

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

xr.parse() を呼び出しているため、実際のアンマーシャリングは成功しません (解析によってストリームが閉じられるため)。ただし、解析エラー[Error] file-name.xml:2:66: cvc-complex-type.3.2.2: Attribute 'xml:base' is not allowed to appear in element 'element name' が発生します。

これは、xinclude が常に含まれる要素にxml:base属性を追加して、ベース URI を保持できるためであることがわかりました。問題は、スキーマがこの属性を許可していないことです。これを取り除く方法はありますか?私はオンラインで見回しましたが、簡単に実装できるものは実際には見たことがありません。

4

1 に答える 1

6

次のコード行を追加しました。

// to get rid of xml:base that is brought in with xinclude
spf.setFeature("http://apache.org/xml/features/xinclude/fixup-base-uris", false); 

この記事に従って、パーサー ファクトリを xinclude 対応に設定したのと同じ場所で

于 2013-06-27T21:12:24.330 に答える