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 式を使用して子ノードと grandChild ノードの詳細を効率的に収集しますか?

4

1 に答える 1

10

XML ドキュメント全体を処理する場合、XML を DOM に解析することは、ほとんどの場合、デシリアライズ時間、CPU 使用率、およびメモリ使用量の点で最も効率的ではありません。

DOM への解析には、XML ドキュメントがディスク容量を必要とするため、約 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 の childNode 要素を含むドキュメントを扱っている場合、200 秒に対して 2 秒の方が問題になります。

于 2009-04-07T10:33:28.087 に答える