java - SAX 解析器可以在 Java 中使用 XPath 吗?

标签 java xml dom xpath sax

我正在尝试将我的一个使用 DOM 解析和大量 XPath 表达式的类迁移到 SAX 解析。 DOM 解析对我来说很好,但我尝试解析的一些文件太大,它们会导致服务器超时。我想将 XPathSAX 解析重用,但我不确定是否可行,如果不可能,请您帮助我,因为我不知道如何以下代码将在我仅使用 SAX 时出现:

Document doc = bpsXml.getDocument();
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1");
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue");

最佳答案

简单地使用 SAX 解析器不会在内存中构建 XML 树的表示(这就是 SAX 内存效率更高的原因)。它只会在遇到新的 XML 元素时触发“事件”。您必须将上下文(通常是一堆父元素)保存在内存中才能“知道”您在树中的位置。

由于内存中没有树,因此无法使用 XPath。您只能测试当前的“上下文”(您的手动托管堆栈)来查询您的文档。请记住,SAX 解析器只会对您的文件执行一次运行,因此文件中的顺序很重要。

幸运的是,还有其他方法,例如 VTD-XML这是一个在内存中构建XML树的库,但只是结构部分,它不会从文件中提取实际内容,内容是根据需要提取的。它的内存效率比 DOM 解析器高得多,同时仍然允许 XPath。我个人在工作中使用这个库来用 XPath 解析大约 700MB 的 XML 文件(是的,这很疯狂,但它确实有效,而且速度非常快。)

关于java - SAX 解析器可以在 Java 中使用 XPath 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791600/

相关文章:

java - 即使包含 User-Agent 属性,从 java 对网站的 GET 请求也会返回 403

php - 使用 Curl 发布 xml 时获取权限被拒绝?

xml - Groovy:XMl:如何在chid标签中删除和替换子标签

java - 如何在没有类文件的情况下从序列化的 Java 对象中检索对象状态

javascript - 如何将本地文件定义为 DOM 对象?

java - CipherInputStream 从不抛出异常

java - 这个 Cypher 查询有什么问题?

java.io.StreamCorruptedException : invalid type code: 00

java - 通过文本内容获取元素 - XML、Java

javascript - JavaScript 剪刀石头布游戏的游戏计数器无法正常工作