XML ドキュメント内の 2 つの異なる子ノードが等しいかどうかを判断したいと考えています。2 つのノードが同じ属性セットと子メモを持ち、すべての子メモも等しい場合 (つまり、サブツリー全体が等しい場合)、それらは等しいと見なされます。
入力ドキュメントは非常に大きく (最大 60MB、比較するノードは 100000 を超えます)、パフォーマンスが問題になる場合があります。
2 つのノードが等しいことを確認する効率的な方法は何ですか?
例:
<w:p>
<w:pPr>
<w:spacing w:after="120"/>
</w:pPr>
<w:r>
<w:t>Hello</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:after="240"/>
</w:pPr>
<w:r>
<w:t>World</w:t>
</w:r>
</w:p>
この XML スニペットは、OpenXML ドキュメントの段落を記述します。このアルゴリズムは、ドキュメント内の前の別の段落と同じプロパティ (w:pPr ノード) を持つ段落 (w:p ノード) がドキュメントに含まれているかどうかを判断するために使用されます。
ノードの外側の XML をハッシュ セットに格納するというアイデアが 1 つあります (通常、属性と子メモが常に同じ方法でソートされる正規の文字列表現を最初に取得する必要がありますが、ノードが既にこのような形になります)。
もう 1 つのアイデアは、ノードごとに XmlNode オブジェクトを作成し、すべての属性と子ノードを比較する比較子を作成することです。
私の環境は C# (.Net 2.0) です。フィードバックやさらなるアイデアは大歓迎です。誰かがすでに良い解決策を持っているのではないでしょうか?
EDIT:MicrosoftのXmlDiff APIは実際にそれを行うことができますが、より軽量なアプローチがあるかどうか疑問に思っていました. XmlDiff は、常に diffgram を生成し、常に正規のノード表現を最初に生成するように見えますが、どちらも必要ありません。
EDIT2:ここで行われた提案に基づいて、最終的に独自の XmlNodeEqualityComparer を実装しました。どうもありがとう!!!!
ありがとう、ディボ