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