java - 在有效的XML上,java JAXP解析错误

  显示原文与译文双语对照的内容
129 2

我试图在Java上运行一些XPath查询,显然推荐的方法是先构造文档。

下面是我使用的标准JAXP代码示例:

import org.w3c.dom.Document;
import javax.xml.parsers.*;
final DocumentBuilder xmlParser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final Document doc = xmlParser.parse(xmlFile);

我还尝试了 Saxon,但得到了同样的错误:

import net.sf.saxon.s9api.*;
final DocumentBuilder documentBuilder = new Processor(false).newDocumentBuilder();
final XdmNode xdm = documentBuilder.build(new File("out/data/blog.xml"));

下面是 DocumentBuilder 1.8中的无法解析的最小重构示例 XML:

<?xml version="1.1" encoding="UTF-8"?>
<xml>
 <![CDATA[Some example text with [funny highlight]]]>
</xml>

根据规范,方括号 ] 刚好在CDATA标记 ]]>的结尾,但解析器刚刚退出了堆栈跟踪和消息。org.xml.sax.SAXParseException; XML document structures must start and end within the same entity.

在包含大量CDATA节的原始数据文件中,消息是org.xml.sax.SAXParseException; The element type"item" must be terminated by the matching end-tag"</item>"在这两种情况下 ´com.sun.org.apache.xerces´ 都出现在。

这两个观点看起来好像解析器只是没有结束 ]]>的CDATA部分。

编辑:结果,当省略 <?xml.. .?> 声明时,该示例将传递。我在这里发帖之前还没有检查过。

时间:原作者:0个回答

87 2

简短答案:将添加到构建路径,它将自动加载,而不是从JDK解析,XML将被解析。复制粘贴Gradle依赖项:

implementation"xerces:xercesImpl:2.11.0"

Some是一个解析器,尽管 2.11日期来自于 2013年,但是日期来自于一个较老的版本,它是一个非常复杂的解析器。真是 sucks !

当Saxon团队把它放在一起:

Saxonica建议使用,中的,解析器,这个版本与在JDK中绑定的版本一样,已经知有一些严重的Bug 。

如果你想知道如何简单地将Xerces放在类路径上,那么问题就会消失:尽管JDK和 Saxon DocumentBuilders构建的文档类型完全不同,但是它们都使用相同的标准Java接口调用解析器,同时也使用相同的机制来查找和加载解析器的( 或者更确切地说,解析器工厂) 。简而言之,java.util.ServiceLoader 被调用并查看 META-INF/services 中的属性文件中的所有 jars,这就是xercesJar如何提供XML解析器。对于我们来说,它自己的jdk实现被任何发现的东西所取代。

在使用 JDK XML类进行这种错误的经验之后,我甚至更愿意将项目重构为XPath处理,而不是XPath实现。另一个原因是XDM优于DOM的技术优势。

原作者:
...