关于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),没有别的,该代码片段没有问题,但是当这个代码片段在具有相同JVM的特定应用程序中运行时,它就像我提到的那样失败;这让我觉得可能存在依赖性问题,但我还没有弄清楚它会是什么。
该应用程序使用xml和xslt处理库,如:
除此之外,我刚刚开始熟悉它们,所以我不确定它们内是否存在冲突,是否存在已知的冲突问题?或者它只是另一回事?我错过了什么吗?你能分享一下你对它的了解吗?
顺便说一句,就目前而言,我只是不能使用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)
get" getXMLEncoding"是包含所提供的代码片段的方法,抱歉,如果我分享的内容超过这个,我可能会遇到麻烦,堆栈跟踪的其余部分只包含应用程序类。
另外,关于我提到的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>
角色&#34;&amp;#12;&#34;根据{{3}}未使用的是使其在XML 1.0上失败的那个,但是由于某种原因它必须得到支持而XML 1.1会这样做,现在问题出在XML版本上。
希望现在的背景更加清晰。
再次感谢!
答案 0 :(得分:1)
对<p>Search1: <input type="text"/></p>
<p>Search2: <input type="text"/></p>
<p>Search3: <input type="text"/></p>
<p>Search4: <input type="text"/></p>
<p>Search5: <input type="text"/></p>
的引用表明您在类路径上有一个(可能是旧的)Sun的sjsxp StAX实现版本。如果在类路径上有一个StAX实现(sjsxp,woodstox等),那么当你执行com.sun.xml.stream
时,它将优先用于JRE中的内置实现。
为了确定无论将哪些内容添加到类路径中它都能工作,你应该依赖于一个已知良好的StAX实现,比如Woodstox,并直接创建一个实例,而不是依赖于XMLInputFactory.newInstance()
newInstance()
答案 1 :(得分:0)
好的,所以我设法解决了我的情况,现在是时候分享我发现的了:
由于我想象这可能是运行时依赖项的问题,我做了一些查看如何注意实现类的加载位置,最后我添加了 -verbose:class VM arg在主程序的执行中查看从哪里加载com.sun.xml.stream.XMLReaderImpl并且我发现它是从 sjsxp.jar 加载的,它正在应用程序中加载运行时,我只是从类路径中删除了这个jar,现在函数正常工作。
结论是,确实,这是在运行时使用此jar而不是JRE的实现来解析依赖项的问题,而且也指向JSR-173的sjsxp.jar不支持XML 1.1
关于-verbose:class VM arg:https://dzone.com/articles/how-use-verbose-options-java 关于他sjsxp.jar(JSR-173):https://sjsxp.java.net/