我想要迁移我的课,它使用的一个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。 您只能测试当前的“上下文”(你manuallay管理堆栈)查询您的document.Remember的SAX解析器只会做你的文件中的一个运行,所以为了在文件中是非常重要的。
幸运的是,像其他的办法VTD-XML这是建立在内存中的XML树,但只有结构部分库,它不提取该文件的实际内容,按需提取内容。 它是更多的内存比DOM解析器,同时仍允许XPath的效率。 我personnaly使用这个库在工作中解析〜700MB的XML文件使用XPath(是的,这太疯狂了,但它的工作原理,这是非常快的。)
恕我直言,处理XML的最简单的方法是使用StAX的 ,则流API XML。 它结合了DOM和SAX的优势(并提供更容易迁移到你)。 你还有一个光标到XML元素(如SAX),但你的代码向前移动光标。 这给了很大的优点XML处理代码变得更具可读性。 这也解决了内存问题,因为只有当前XML元素已在内存中保存。 这也是一个很好的教程 。
也回答你原来的问题:在谷歌很短的搜索结果显示我有这可能意味着所有的自定义解决方案是不稳健,不维护,不经过充分测试的不容易的,被广泛接受的方式。
切换到SAX解析(或StAX的)将需要在你的方法完全改变。 看起来好像你还没有充分认识到这将多少工作是。 对于任何建议是有道理的,我们需要知道文件有多大,什么样的处理要与数据做的。 如果你是过滤数据,例如,然后使用文档投影XQuery实现可能是一个很好的答案(这将自动使用SAX幕后打造只含有你真正感兴趣的数据子集的树) 。