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

时间:2009-03-31 12:45:35

标签: xml dom xpath dom4j

例如,请考虑以下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表达式来收集子节点和grandChild节点的细节是否有效?

1 个答案:

答案 0 :(得分:8)

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

解析到DOM需要大约10-15倍的内存量,因为XML文档需要磁盘空间。例如,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 doucment的一部分的简单方法。我不建议使用它来处理所有XML文档。

到目前为止,如果您确实希望提取和处理XML文档中的所有数据,那么最好的方法是使用基于SAX的阅读器。与其他任何方法相比,这将快两个数量级,并且资源更少。

尽管如此,它还取决于您正在处理的数据量。对于您提供的示例XML文档,您将不会注意到任何实际差异。是的,DOM将“缓慢”,SAX将“快速”,但我们正在谈论毫秒或微秒的差异。

SAX可以比DOM快几百或几千倍,但如果这是2微秒和2毫秒之间的差异,你就不会注意到。当您处理包含20,000个childNode元素的文档时,2秒与200秒将成为一个问题。