是否有适用于SAX型号的XPath处理器?

use*_*603 56 java xml xpath sax

我正在寻找一个XPath评估器,它不会重建整个DOM文档来查找文档的节点:实际上该对象是使用SAX模型管理大量XML数据(理想情况下超过2Gb),这非常有利于内存管理,并提供搜索节点的可能性.

谢谢大家的支持!

对于所有那些说不可能的人:我最近在问到这个问题后,发现了一个名为"saxpath"的项目(http://www.saxpath.org/),但我找不到任何实施项目.

kop*_*por 16

我目前的列表(根据网络搜索结果和其他答案编译)是:

下一步是使用XMLDog的示例并比较所有这些方法的性能.然后,测试用例应扩展到支持的XPath表达式.

  • 伟大的名单,节省了我很多时间.关于他们的活动和容易纳入项目的一些评论:1.xpath4sax:不在maven中.上次提交于2013年2月7日[google code repo](https://code.google.com/archive/p/xpath4sax/source/default/commits),[github repo](https://github.com/pprados/ xpath4sax)2.spex:不在maven中.最后一次提交于2006年6月9日[cvs repo](https://sourceforge.net/projects/spex/files/?source=navbar)我也打算使用XMLDog,它在maven repo上更加活跃并且可用. (2认同)

小智 12

我们通过使用SAX解析器定期解析1GB +复杂的XML文件,该解析器提取可以使用XPath方便查询的部分DOM树.我在这里写了博客:http://softwareengineeringcorner.blogspot.com/2012/01/conveniently-processing-large-xml-files.html - 源代码可以在github上获得 - 麻省理工学院许可证.


Sim*_*nni 9

XPath可以与SAX一起使用,并且大多数XSLT处理器(尤其是Saxon和Apache Xalan)都支持在SAX流上的XSLT内执行XPath表达式,而无需构建整个dom.

他们非常粗略地设法做到这一点,如下:

  1. 检查他们需要匹配的XPath表达式
  2. 接收SAX事件并测试是否需要该节点或其中一个XPath表达式需要该节点.
  3. 如果它对XPath表达式没用,请忽略SAX事件.
  4. 如果需要,可以缓冲它

它们如何缓冲它也是非常有趣的,因为有些只是在这里和那里简单地创建DOM片段,其他人使用非常优化的表来快速查找和减少内存消耗.

他们设法优化的程度在很大程度上取决于他们找到的XPath查询的类型.正如已经发布的Saxon文档清楚地解释的那样,向上移动然后"横向"遍历(兄弟姐妹)文档的查询显然需要整个文档存在,但是大多数文档只需要保留几个节点RAM随时都有.

我很确定这一点,因为当我每天仍在使用Cocoon制作webapp时,每次在XSLT中使用"// something"表达式时,我们都遇到了XSLT内存占用问题,而且我们经常不得不重新编写XPath表达式允许更好的SAX优化.


Pav*_*aev 6

SAX是只进,而XPath查询可以在任何方向导航文件(考虑parent::,ancestor::,preceding::preceding-sibling::轴).我不知道一般来说这是怎么可能的.最好的近似值是某种延迟加载DOM,但根据您的查询,这可能会或可能不会给您任何好处 - 总是存在最坏情况的查询,例如//*[. != preceding::*].


Fel*_*ing 0

嗯,我不知道我是否真的理解你。据我所知,SAX模型是面向事件的。这意味着,如果在解析过程中遇到某个节点,您将执行某些操作。是的,这对记忆更好,但我不明白你想如何将 XPath 纳入其中。由于 SAX 不构建模型,因此我认为这是不可能的。