<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节点的细节是否有效?
如果要完整地处理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秒将成为一个问题.