相关疑难解决方法(0)

您如何比较两个XML文档?

作为一些广泛的单元测试的基类的一部分,我正在编写一个辅助函数,它在C#(.NET)中递归地将一个XmlDocument对象的节点与另一个XmlDocument对象的节点进行比较.一些要求:

  • 第一个文档是源代码,例如我希望XML文档看起来像什么.因此,第二个是我想要找到差异的那个,它不能包含不在第一个文档中的额外节点.
  • 当发现太多显着差异时必须抛出异常,并且应该通过人们对该描述进行瞥见来容易理解.
  • 子元素顺序很重要,属性可以按任何顺序排列.
  • 有些属性是可以忽略的; 特别是xsi:schemaLocationxmlns:xsi,虽然我希望能够通过在哪些.
  • 名称空间的前缀必须在属性和元素中都匹配.
  • 元素之间的空白是无关紧要的.
  • 元素将要么有子元素 InnerText,但不能同时.

虽然我正在废弃一些东西:有没有人写过这样的代码,是否有可能在这里分享?

顺便说一下,你会把第一个和第二个文件称为什么?我一直把它们称为"源"和"目标",但它感觉不对,因为是我希望目标看起来像,否则我抛出异常.

.net c# xml xmldocument compare

60
推荐指数
7
解决办法
8万
查看次数

用于比较XML节点的高效算法

我想确定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>
Run Code Online (Sandbox Code Playgroud)

此XML片段描述了OpenXML文档中的段落.该算法将用于确定文档是否包含具有与文档前面的另一段相同属性(w:pPr节点)的段落(w:p节点).

我的一个想法是将节点的外部XML存储在一个哈希集中(通常我必须首先得到规范的字符串表示,其中属性和子注释总是以相同的方式排序,但我可以期望我的节点已经到是这样一种形式).

另一个想法是为每个节点创建一个XmlNode对象,并编写一个比较所有属性和子节点的比较器.

我的环境是C#(.Net 2.0); 我们非常欢迎任何反馈和进一步的想法.也许有人甚至已经有了一个很好的解决方案?

编辑:微软的XmlDiff API实际上可以这样做,但我想知道是否会有一个更轻量级的方法.XmlDiff似乎总是产生一个diffgram,并且总是先生成一个规范的节点表示,这两件事我都不需要.

EDIT2:我最终根据这里提出的建议实现了我自己的XmlNodeEqualityComparer.非常感谢!!!!

谢谢,divo

c# xml algorithm comparison performance

13
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×2

xml ×2

.net ×1

algorithm ×1

compare ×1

comparison ×1

performance ×1

xmldocument ×1