【问题标题】:Compare 2 XML files using just C#仅使用 C# 比较 2 个 XML 文件
【发布时间】:2012-03-12 19:18:35
【问题描述】:

我正在寻找一种方法来与 XML 文件(下面的示例)进行比较,并创建一个包含两个文件差异的 xpath 的列表,以便我可以检查发生了什么变化。

这可以在 Linq 中完成,还是我需要使用 MS Diff 补丁,我真的很想在 C# 中完成这一切,而不需要任何额外的 Dll。

或者我应该只循环遍历一个 XML 文件并将其与另一个进行比较,但是如果我这样做,我可能会错过任何新的或删除的节点!

文件 A

<info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum>1</LNameNum>
      <NumPeople>1</NumPeople>
      <NameType/>
      <LName>TEST</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>B test</Comment>
    </Segment>
  </Retrieve>
</info>

文件 B:

    <info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum>1</LNameNum>
      <NameType/>
      <LName>TESTING</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Status>HS</Status>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>COULD I USE LINQ</Comment>
    </Segment>
  </Retrieve>
</info>

输出 XPath 列表

/info/Retrieve/LastNameInfo/NumPeople
/info/Retrieve/LastNameInfo/LName
/info/Retrieve/Segment[1]/Status
/info/Retrieve/Segment[2]/Comment

【问题讨论】:

  • 请为上述示例文件提供所需的输出。
  • 我们是否假设两个文件之间的 XML 结构必须匹配?
  • 用我希望生成的 Xpath 列表更新了 Q 作为输出。然后我会在代码中检查每个文档中的每个 Xpath,并决定保留或合并结果...
  • 如果元素存在则结构将匹配,它们将位于同一位置,但例如最多可能有 9 个 Segments 部分或没有!
  • @Adrian 只有您知道您期望的变化。在文件可以变化的程度受到限制的情况下,可能会获得有限的解决方案。但一般问题类似于比较文本文件

标签: c# xml .net-4.0 linq-to-xml


【解决方案1】:

我假设您想比较 XML(信息集)的等价性,而不仅仅是文件的词法等价性。 XML 在其词法形式(引用的选择、无关紧要的空格、属性的顺序)上可以有很大的不同。所有这些都可以在不影响信息集的情况下进行更改。

我会规范化文件 XML Canonicalization algorithm gives two difference results when called directly than when called as part of an xml digital signature? 并测试词汇同一性。如果它们不相等,则可能很难确定它们的不同之处(细微的差异相对容易,但当元素顺序等很重要时,可能没有客观差异。

我已经为我自己的应用程序(在 Java 中,抱歉)完成了这项工作,这并非易事 - 我再次假设文件之间相当接近。我还使它适用于必须在 epsilon 内达成一致的实数,其中词汇等价不够好。

查看Xml Comparison in C# 了解一些 XMLDiff 工具

【讨论】:

  • 如果您知道甚至可以使用外部工具来做这样的事情,我会很感兴趣?
  • 这是 MS XMLDiff 和补丁 msdn.microsoft.com/en-us/library/aa302294.aspx - 此页面显示了必须考虑的不同事项
  • 嗨,是的,它是我希望比较的信息集,文件总是不同的,因为它包含时间戳等,但它是我要比较的节点内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多