XMLStreamException:不支持XML版本“1.1”,只有XML 1.0支持

问题描述:

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

在这部分程序:

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)中使用相同部分的代码,那么这个代码片段没有问题,但是当这个代码片段在具有相同JVM的特定应用程序中运行时,它会失败我提到的方式;这表明我认为可能存在依赖性问题,但我还没有弄清楚它可能是什么。

应用程序使用XML和XSLT处理库,如:

  • 撒克逊9
  • 的Xerces
  • 蓖麻XML
  • 的Xalan

其中,我刚开始熟悉它们,所以我不确定它们内部是否会有冲突,是否有任何已知的冲突问题?或者它只是另一种不同的东西?我错过了什么?你能分享一下你对它的了解吗?

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

谢谢!

编辑:

好感谢您的意见,我知道这可能是一个非常广泛的问题,但说实话,这是我面临的权利现在的情况,这就是为什么我在找一个提示可能是什么问题,从而进一步调查和改进信息。

这是异常跟踪的一部分:

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”是包含的代码所提供的片段,抱歉,但我可能会惹上麻烦的方法,如果我分享不止于此,其余stacktrace只包含应用程序类。

此外,关于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> 

字符“&#12;”根据www.w3.org未被使用的是使其在XML 1上失败的一个。0,但由于某些原因,它必须支持并且XML 1.1才能支持,现在问题出现在XML版本中。

希望现在情况更清楚。

再次感谢!

+2

撒克逊支持[1.1 XSD,而现在(http://www.saxonica.com/documentation9.5/#!conformance/schema11)。它也支持XML 1.1。您的文本不是很清楚您的错误是否与使用的XML版本(1.1是_very,非常罕见)或XSD版本(更常见的是1.1)有关,这将有助于显示您获得的_exact_错误,并且最好与提升它的工具列表中的确切工具。 – Abel

+0

添加到@ Abel的观点:XML和XSD版本中的1.1完全不同。你应该说明你为什么需要其中一个或两个的具体原因,并询问关于特定图书馆特定版本的具体问题。您的帖子在大量标准和工具中漫游,而没有真正要求回答的问题。 – kjhughes

+1

@ kjhughes,但这可能是因为OP说“我刚刚开始熟悉它们”,如果你第一次开始就很难区分所有这些工具和技术层次(这并不是说我们不需要获得更好的细节)。 – Abel

com.sun.xml.stream参考建议你有Sun的SJSXP StAX的实现上(可能是旧的)版本你的类路径。如果在类路径中有StAX实现(sjsxp,woodstox等),那么当您执行XMLInputFactory.newInstance()时,将优先使用JRE中的内置实现。

为了确定它可以工作,无论添加到类路径中是否还有其他东西,您应该依赖已知良好的StAX实现(如Woodstox),并直接创建一个实例,而不是依赖反射方法的newInstance()

XMLInputFactory factory = new WstxInputFactory(); 
+0

谢谢伊恩,你的方法很好,它应该是这样的,不幸的是在我的情况下,已经有一个已经实现的应用程序,其中包含大量的组件和库引用,实际上,我只是证明了这种情况是依赖关系解析但不是最终的解决方案,因为我可能会破坏别的东西,现在我需要确保我可以更改或删除该库或在类路径中使用该jar,强制使用JRE实现,我现在不会可能的或者介绍你的建议Woodstox。 – Ohtar10

+0

我想给你正确的答案,因为尽管仍然有一些问题,这种方法显示了一个清晰的工作场景,并与主要问题联系在一起。谢谢老师。 – Ohtar10

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

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

结论是,这是一个运行时依赖解析的问题,由于使用了这个jar而不是JRE的实现,而且sjsxp.jar也指出JSR-173不支持XML 1.1。

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