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> </xsl:text>
字符“&#12;”根据www.w3.org未被使用的是使其在XML 1上失败的一个。0,但由于某些原因,它必须支持并且XML 1.1才能支持,现在问题出现在XML版本中。
希望现在情况更清楚。
再次感谢!
到com.sun.xml.stream
参考建议你有Sun的SJSXP StAX的实现上(可能是旧的)版本你的类路径。如果在类路径中有StAX实现(sjsxp,woodstox等),那么当您执行XMLInputFactory.newInstance()
时,将优先使用JRE中的内置实现。
为了确定它可以工作,无论添加到类路径中是否还有其他东西,您应该依赖已知良好的StAX实现(如Woodstox),并直接创建一个实例,而不是依赖反射方法的newInstance()
XMLInputFactory factory = new WstxInputFactory();
好了,我设法解决我的情况,现在是时候和大家分享我发现:
因为我想象这可能是在运行时依赖的问题,我做了一些在如何发现哪里查找实现类被加载,最后我在主程序的执行过程中添加了-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/
撒克逊支持[1.1 XSD,而现在(http://www.saxonica.com/documentation9.5/#!conformance/schema11)。它也支持XML 1.1。您的文本不是很清楚您的错误是否与使用的XML版本(1.1是_very,非常罕见)或XSD版本(更常见的是1.1)有关,这将有助于显示您获得的_exact_错误,并且最好与提升它的工具列表中的确切工具。 – Abel
添加到@ Abel的观点:XML和XSD版本中的1.1完全不同。你应该说明你为什么需要其中一个或两个的具体原因,并询问关于特定图书馆特定版本的具体问题。您的帖子在大量标准和工具中漫游,而没有真正要求回答的问题。 – kjhughes
@ kjhughes,但这可能是因为OP说“我刚刚开始熟悉它们”,如果你第一次开始就很难区分所有这些工具和技术层次(这并不是说我们不需要获得更好的细节)。 – Abel