我正在寻找一种与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
答案 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工具