我想确定 XML 文档中的两个不同子节点是否相等。如果两个节点具有相同的一组属性和子注释并且所有子注释也相等(即整个子树应该相等),则它们应该被认为是相等的。
输入文档可能非常大(最多 60MB,超过 100000 个要比较的节点)并且性能是一个问题。
检查两个节点是否相等的有效方法是什么?
例子:
<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 存储在一个哈希集中(通常我必须首先获得一个规范的字符串表示,其中属性和子注释总是以相同的方式排序,但我可以期望我的节点已经是这样的形式)。
另一个想法是为每个节点创建一个 XmlNode 对象并编写一个比较器来比较所有属性和子节点。
我的环境是 C# (.Net 2.0);非常欢迎任何反馈和进一步的想法。也许有人甚至已经有了一个好的解决方案?
编辑:微软的 XmlDiff API 实际上可以做到这一点,但我想知道是否会有更轻量级的方法。XmlDiff 似乎总是产生一个 diffgram 并且总是首先产生一个规范的节点表示,这两件事我都不需要。
EDIT2:我终于根据这里提出的建议实现了我自己的 XmlNodeEqualityComparer 。非常感谢!!!!
谢谢,迪沃