【发布时间】:2008-12-05 12:28:28
【问题描述】:
我想确定一个 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 sn-p 描述 OpenXML 文档中的段落。该算法将用于确定文档中是否包含一个段落(w:p 节点),其属性(w:pPr 节点)与文档中前面的另一个段落具有相同的属性(w:pPr 节点)。
我的一个想法是将节点的外部 XML 存储在一个哈希集中(通常我必须首先获得一个规范的字符串表示,其中属性和子注释总是以相同的方式排序,但我可以期待我的节点已经是这种形式)。
另一个想法是为每个节点创建一个 XmlNode 对象并编写一个比较器来比较所有属性和子节点。
我的环境是 C# (.Net 2.0);非常欢迎任何反馈和进一步的想法。也许有人甚至已经有了一个好的解决方案?
编辑:微软的 XmlDiff API 实际上可以做到这一点,但我想知道是否会有更轻量级的方法。 XmlDiff 似乎总是产生一个 diffgram 并且总是首先产生一个规范节点表示,这两件事我都不需要。
EDIT2:我终于根据这里提出的建议实现了我自己的 XmlNodeEqualityComparer。非常感谢!!!!
谢谢, 迪沃
【问题讨论】:
-
您好,感谢您的评论。 XmlDiff 看起来不错,但对于我的具体问题来说似乎相当沉重。我不需要找到任何关于差异的信息,一个简单的相等或不相等测试就足够了,我不需要创建 XmlDiff 总是做的规范表示。
标签: c# xml algorithm comparison performance