【发布时间】: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> </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 说 “我刚刚开始熟悉它们”...,很难区分所有如果您刚开始,这些工具和技术层(这并不是说我们不需要获得更好的细节)。
-
至少发布一个堆栈跟踪,以便我们可以看到哪个代码导致了错误消息。