使用xinclude之后,如何摆脱添加到xml文档中的xml:base属性?

cha*_*ama 3 xml xinclude jaxb xml-parsing

我正在尝试使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我正在调用xr.parse(),因此实际的解组操作不会成功(因为解析会关闭流)。但是,我遇到了解析错误[错误] file-name.xml:2:66:cvc-complex-type.3.2.2:不允许属性'xml:base'出现在元素'element name'中

我发现这是因为xinclude总是向包含的元素添加xml:base属性,以帮助保留基本uri。问题是我的架构不允许该属性。有什么办法让我摆脱它吗?我在网上四处看看,还没有真正看到任何可以轻松实现的东西。

cha*_*ama 5

我添加了以下代码行:

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

在同一个地方,我设置的解析器工厂为每XInclude的知道这篇文章