我正在尝试迁移我的一个使用的类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 http://vtd-xml.sourceforge.net/这是一个在内存中构建XML树的库,但只是结构部分,它不会从文件中提取实际内容,内容是根据需要提取的。它比 DOM 解析器具有更高的内存效率,同时仍然允许 XPath。我个人在工作中使用这个库通过 XPath 解析大约 700MB 的 XML 文件(是的,这很疯狂,但它确实有效,而且速度非常快。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)