【问题标题】:"Error attempting to parse XML file" when parsing using XInclude使用 XInclude 解析时出现“尝试解析 XML 文件时出错”
【发布时间】:2013-05-31 06:22:22
【问题描述】:

我正在尝试使用 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>

并包含.xml:

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

为了真正解组它,我创建了一个新的FileReader,其中包含我的 xml 文件的路径(path-to-xml-files/main.xml - 路径是正确的,因为它可以清楚地找到主文件) .但是,当我运行它时,包含的文件有问题。我收到带有链接 SAXParseException 的 UnmarshalException 并带有以下错误消息:尝试解析 XML 文件时出错 (href='path-to-xml-files/included.xml')。

当我手动将included.xml的内容合并到main.xml中时,它运行没有问题。

我不知道这是 JAXB 问题还是 XInclude 问题,但我强烈怀疑是后者。

我错过了什么?

【问题讨论】:

    标签: xml-parsing jaxb xinclude


    【解决方案1】:

    我为这个完全相同的问题奋斗了三个小时,最后我发现了这个:

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

    简而言之,你需要添加以下行:

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

    【讨论】:

    • 此网址不存在...或许可以参考官方出处:xerces.apache.org/xerces2-j/features.html
    • 我有相同的方法,将 SaxParserFactory 功能 http://apache.org/xml/features/xinclude/fixup-base-uris 设置为 false 在这里没有帮助。还有其他人在这方面取得了成功吗?
    【解决方案2】:

    我遇到了完全相同的问题。 实际上,href 属性需要一个 URI,它可以是:

    • HTTP 地址(这意味着您包含的 XML 必须托管在某处)
    • 或本地计算机上的文件。但在这种情况下,您需要为其添加前缀“file:...”并提供绝对路径。

    用你的例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2016-06-25
      • 2014-04-19
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多