仅使用C#比较2个XML文件

时间:2011-01-11 18:04:27

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

我正在寻找一种与XML文件进行比较的方法(下面的示例),并创建一个包含两个文件差异的xpath的列表,以便我可以检查更改的内容。

这可以在Linq中完成,还是需要使用MS Diff补丁,我真的很想在没有任何额外Dll的情况下在C#中完成所有操作。

或者我应该只循环一个XML文件并将其与另一个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

1 个答案:

答案 0 :(得分:1)

我假设你想要比较XML(Infoset)的等价性,而不仅仅是文件的词汇等价性。 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工具