use*_*603 56 java xml xpath sax
我正在寻找一个XPath评估器,它不会重建整个DOM文档来查找文档的节点:实际上该对象是使用SAX模型管理大量XML数据(理想情况下超过2Gb),这非常有利于内存管理,并提供搜索节点的可能性.
谢谢大家的支持!
对于所有那些说不可能的人:我最近在问到这个问题后,发现了一个名为"saxpath"的项目(http://www.saxpath.org/),但我找不到任何实施项目.
kop*_*por 16
我目前的列表(根据网络搜索结果和其他答案编译)是:
下一步是使用XMLDog的示例并比较所有这些方法的性能.然后,测试用例应扩展到支持的XPath表达式.
小智 12
我们通过使用SAX解析器定期解析1GB +复杂的XML文件,该解析器提取可以使用XPath方便查询的部分DOM树.我在这里写了博客:http://softwareengineeringcorner.blogspot.com/2012/01/conveniently-processing-large-xml-files.html - 源代码可以在github上获得 - 麻省理工学院许可证.
XPath可以与SAX一起使用,并且大多数XSLT处理器(尤其是Saxon和Apache Xalan)都支持在SAX流上的XSLT内执行XPath表达式,而无需构建整个dom.
他们非常粗略地设法做到这一点,如下:
它们如何缓冲它也是非常有趣的,因为有些只是在这里和那里简单地创建DOM片段,其他人使用非常优化的表来快速查找和减少内存消耗.
他们设法优化的程度在很大程度上取决于他们找到的XPath查询的类型.正如已经发布的Saxon文档清楚地解释的那样,向上移动然后"横向"遍历(兄弟姐妹)文档的查询显然需要整个文档存在,但是大多数文档只需要保留几个节点RAM随时都有.
我很确定这一点,因为当我每天仍在使用Cocoon制作webapp时,每次在XSLT中使用"// something"表达式时,我们都遇到了XSLT内存占用问题,而且我们经常不得不重新编写XPath表达式允许更好的SAX优化.
SAX是只进,而XPath查询可以在任何方向导航文件(考虑parent::
,ancestor::
,preceding::
和preceding-sibling::
轴).我不知道一般来说这是怎么可能的.最好的近似值是某种延迟加载DOM,但根据您的查询,这可能会或可能不会给您任何好处 - 总是存在最坏情况的查询,例如//*[. != preceding::*]
.
嗯,我不知道我是否真的理解你。据我所知,SAX模型是面向事件的。这意味着,如果在解析过程中遇到某个节点,您将执行某些操作。是的,这对记忆更好,但我不明白你想如何将 XPath 纳入其中。由于 SAX 不构建模型,因此我认为这是不可能的。
归档时间: |
|
查看次数: |
28311 次 |
最近记录: |