Algorithme efficace pour comparer les noeuds XML

Je veux déterminer si deux nœuds enfants au sein d'un document XML sont égaux ou non. Deux nœuds doivent être considérées comme égales si elles ont le même ensemble d'attributs et de l'enfant les notes et tous les enfants de notes sont égales, trop (c'est à dire l'ensemble des sous arbres doivent être identiques).

Le document d'entrée est peut-être très large (jusqu'à 60 mo, plus de 100000 nœuds à comparer) et de la performance est un problème.

Ce qui serait un moyen efficace pour vérifier l'égalité de deux nœuds?

Exemple:

<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>

Ce fragment de code XML décrit dans les paragraphes d'un document OpenXML. L'algorithme serait utilisé pour déterminer si un document contient un paragraphe (en w:p nœud) avec les mêmes propriétés (w:pPr nœud) comme un autre paragraphe plus haut dans le document.

Une idée que j'ai serait de stocker les nœuds externes XML dans une table de hachage set (Normalement je devrais obtenir un canoniques représentation de chaîne des attributs et de l'enfant notes sont triées toujours de la même façon, mais je peux attendre mon nœuds déjà d'être dans un formulaire).

Une autre idée serait de créer un objet XmlNode pour chaque nœud et d'écrire un comparateur qui compare tous les attributs et les nœuds enfants.

Mon environnement C# (.Net 2.0); tous les commentaires et idées sont les bienvenus. Peut-être quelqu'un a même déjà une bonne solution?

EDIT: Microsoft XmlDiff API peut réellement le faire, mais je me demandais si il y aurait un plus léger approche. XmlDiff semble toujours produire un diffgram et à toujours produire un canoniques nœud représentation première, les deux choses que je n'ai pas besoin.

EDIT2: j'ai enfin mes propres XmlNodeEqualityComparer basé sur la suggestion faite ici. Merci beaucoup!!!!

Grâce,
divo

source d'informationauteur Dirk Vollmar