我正在尝试将我的使用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文件(是的,但很疯狂,但是它非常快。)