【问题标题】:XMLStreamException: XML version "1.1" is not supported, only XML 1.0 is supportedXMLStreamException:不支持 XML 版本“1.1”,仅支持 XML 1.0
【发布时间】:2016-02-13 07:46:44
【问题描述】:

关于 XML 模式版本和 java 中的解析库,我知道最好的方法是使用“1.0”而不是“1.1”,因为并非所有库和环境都支持它,而且好处几乎没有,但面临在 XML 模式“1.1”“必须”得到支持的情况下,我有以下问题:

在这部分代码中:

    XMLInputFactory factory = XMLInputFactory.newInstance();
    XMLEventReader reader = factory.createXMLEventReader(XsltTest.class.getResourceAsStream("/an-xsl-file.xsl"));

    String encoding = null;
    if(reader.hasNext()){
        XMLEvent event = reader.nextEvent();
        if(event instanceof StartDocument){
            encoding = ((StartDocument)event).getCharacterEncodingScheme();
        }
    }

其中“an-xsl-file.xsl”是使用 XML Schema 版本“1.1”的 XSLT 文件,调用 reader.nextEvent() 时会引发 XMLStreamException,认为仅支持 XML 1.0,如果我使用在一个孤立的java项目(jdk 1.7)中的相同部分代码没有别的,sn-p没有问题,但是当这个sn-p在具有相同JVM的特定应用程序中运行时,它会按照我提到的方式失败;这让我认为可能存在依赖问题,但我无法弄清楚它可能是什么。

应用程序正在使用 xml 和 xslt 处理库,例如:

  • 撒克逊 9
  • Xerces
  • Castor XML
  • 夏兰

其中,我刚刚开始熟悉它们,所以我不确定它们内部是否存在冲突,是否存在任何已知的冲突问题?还是只是另一件事?我错过了什么吗?你能分享一下你对它的了解吗?

顺便说一句,目前我不能使用 XML 1.0 版本,主要是因为该文档使用了 1.1 中才支持的字符代码。

谢谢!

编辑:

好的,感谢 cmets,我知道这可能是一个非常广泛的问题,但老实说,这就是我现在面临的情况,这就是为什么我要进一步寻找可能是什么问题的提示调查和改进信息。

这是异常跟踪的一部分:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,20]
Message: XML version "1.1" is not supported, only XML 1.0 is supported.
        at com.sun.xml.stream.XMLReaderImpl.next(XMLReaderImpl.java:508)
        at com.sun.xml.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:62)
        at com.pkg.tofailing.artifact.ClassWithError.getXMLEncoding(ClassWithError.java:216)

其中 "getXMLEncoding" 是包含所提供的 sn-p 代码的方法,抱歉,如果我共享的更多,我可能会遇到麻烦,堆栈跟踪的其余部分只包含应用程序类。

另外,关于我提到的 xsl 文件,它是这样开始的:

<?xml version="1.1" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>

在读取第一行时发生故障,遇到 1.1 版本的 XML,如果我将其更改为 1.0,则在后面的行中会出现另一个错误,其中包含以下内容:

<xsl:text>&#12;&#10;</xsl:text>

字符“”根据www.w3.org 未使用它是导致它在 XML 1.0 上失败的原因,但是由于某种原因它必须得到支持,而 XML 1.1 做到了,现在问题出在 XML 版本上。

希望现在上下文更清楚。

再次感谢!

【问题讨论】:

  • 撒克逊支持XSD 1.1 for a while now。它还支持 XML 1.1。您的文本不太清楚您的错误是否与使用的 XML 版本(1.1 非常非常罕见)或 XSD 版本(更常见的是 1.1)有关,这将有助于显示您得到的 exact 错误,最好使用引发它的工具列表中的确切工具。
  • 补充@Abel 的观点:XML 和XSD 版本中的1.1 完全不同。您应该说明需要其中一个或两个的具体原因,并就特定库的特定版本提出具体问题。您的帖子在大量标准和工具中徘徊,却没有真正提出可回答的问题。
  • @kjhughes,但这可能是因为 OP 说 “我刚刚开始熟悉它们”...,很难区分所有如果您刚开始,这些工具和技术层(这并不是说我们不需要获得更好的细节)。
  • 至少发布一个堆栈跟踪,以便我们可以看到哪个代码导致了错误消息。

标签: java xml xslt


【解决方案1】:

com.sun.xml.stream 的引用表明您的类路径中有一个(可能是旧的)版本的Sun sjsxp StAX 实现。如果类路径上有 StAX 实现(sjsxp、woodstox 等),那么当您执行 XMLInputFactory.newInstance() 时,将优先使用 JRE 中的内置实现。

为了确保无论其他什么添加到类路径中它都能正常工作,您应该依赖已知良好的 StAX 实现(例如 Woodstox)并直接创建它的实例,而不是依赖于newInstance()

XMLInputFactory factory = new WstxInputFactory();

【讨论】:

  • 谢谢伊恩,你的方法很好,应该是这样,可悲的是,在我的情况下,有一个已经实现的应用程序,其中包含大量组件和库引用,包括那个,事实上,我刚刚证明了该案例是依赖解决方案,但不是最终解决方案,因为我可能会破坏其他东西,现在我需要确保我可以更改或删除该库或在类路径中使用该 jar,强制使用 JRE 实现我现在不知道是否可能或介绍您对 Woodstox 的建议。
  • 我想给你正确的答案,因为尽管仍然存在一些问题,但这种方法显示了一个清晰的工作场景并与主要问题相关联。谢谢先生。
【解决方案2】:

好的,所以我设法解决了我的情况,现在是时候分享我的发现了:

因为我认为这可能是运行时依赖项的问题,所以我做了一些查找如何注意加载实现类的位置,最后我只是添加了 -verbose:class VM arg 在主程序的执行中查看 com.sun.xml.stream.XMLReaderImpl 的加载位置,我发现它是从 sjsxp.jar 加载的,它正在应用程序中加载运行时,我刚刚从类路径中删除了这个 jar,现在该函数可以正常工作了。

结论是,确实,这是一个运行时依赖解析的问题,通过使用这个 jar 而不是 JRE 的实现,并且也指向 JSR-173 的 sjsxp.jar 不支持 XML 1.1 .

关于 -verbose:class VM 参数:https://dzone.com/articles/how-use-verbose-options-java 关于他 sjsxp.jar (JSR-173):https://sjsxp.java.net/

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2012-04-05
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多