XPath在Dom4J中与使用DOM相比效率如何?

5
例如,考虑以下XML:
<root>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
  <childNode attribute1="value1">
     <grandChildNode attrib1="val1" attrib2="val2">some content1
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content2
     </grandChildNode>
     <grandChildNode attrib1="val1" attrib2="val2">some content3
     </grandChildNode>
  </childNode>
</root>

使用DOM获取根节点,然后遍历childNode和grandChildNode是否高效,还是使用XPath表达式来收集子节点和孙子节点的详细信息更高效?

1个回答

10

如果你想要完整地处理一个XML文档,将XML解析为DOM几乎总是在反序列化时间、CPU使用率和内存使用方面效率最低的方法。

将XML解析为DOM需要约10-15倍于磁盘空间所需的内存量。例如,一个1兆字节的XML文档会解析为一个占用10-15兆字节内存的DOM。

只有当你打算修改部分或全部数据,然后将结果放回到XML文档中时,才应该解析成DOM。对于所有其他用例,DOM都是个不好的选择。

XPath通常比较节省资源,但这取决于文档的长度(即你有多少个“childNode”元素)以及您感兴趣的数据在文档中的位置。

XPath的内存使用和完成时间往往随着您深入文档而增加。例如,假设您有一个带有20,000个childNode元素的XML文档,每个childNode都有一个您提前知道的唯一标识符,并且您想从文档中提取一个已知的childNode。提取第18,345个childNode使用的内存将比提取第3个更多得多。

因此,如果您正在使用XPath提取所有childNode元素,可能会发现它比解析为DOM效率低。XPath通常是从XML文档中提取部分数据的简单方法。我不建议将其用于处理整个XML文档。

如果你确实想要提取和处理XML文档中的所有数据,远远最好的方法是使用基于SAX的阅读器。这将比任何其他方法都快得多,并且资源使用也更少。

话虽如此,这也取决于您所处理的数据量。对于您提供的示例XML文档,您不会注意到任何实际差异。是的,DOM会“慢”,而SAX会“快”,但我们正在谈论毫秒或微秒的差别。

SAX可以比DOM快上百倍甚至千倍,但是如果只相差2微秒和2毫秒,你可能不会注意到区别。但当你处理一个包含20,000个子节点元素的文档时,2秒与200秒之间的差距将成为更大的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接