比较2个XML文件

时间:2012-02-29 19:54:11

标签: c# xml

是否可以比较2个XML文件并仅使用delta生成XML?

例如,这是我的XML:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="1" date="2012-02-29"> 
<Event id="2" date="2012-02-29"> 
<Event id="3" date="2012-02-29"> 
<Event id="4" date="2012-02-29"> 
<Event id="5" date="2012-02-29"> 
</Events>

这个XML:

<?xml version="1.0" encoding="utf-8"?>
<Events>
<Event id="1" date="2012-02-29">
<Event id="2" date="2012-02-29">
<Event id="3" date="2012-02-29">
<Event id="4" date="2012-02-29">
<Event id="5" date="2012-03-01">
<Event id="6" date="2012-03-01">
<Event id="7" date="2012-03-07">
</Events>

所以我将得到的是:

<?xml version="1.0" encoding="utf-8"?>
<Events>
<Event id="5" date="2012-03-01">
<Event id="6" date="2012-03-01">
<Event id="7" date="2012-03-07">
</Events>

由于: 事件ID 5更改了日期,6和7是新的。

知道如何处理C#?

3 个答案:

答案 0 :(得分:3)

您可能想查看xmldiff补丁和gui工具。它允许您比较2个xml文件 - http://msdn.microsoft.com/en-us/library/aa302295.aspx

此页面顶部有一个exe的下载链接 - http://msdn.microsoft.com/en-us/library/aa302294.aspx

答案 1 :(得分:1)

这个特殊的例子很容易得到改变。如果真正的xml文件是这样的,你可以尝试调整这段代码:

var doc1 = XDocument.Load(infile1);
var doc2 = XDocument.Load(infile2);
var dict =  doc1.Root.Elements("Event").ToDictionary(el => 
    el.Attribute("id").Value);
doc2.Root.Elements("Event").ToList().ForEach(el => {
    XElement el2;
    if (dict.TryGetValue(el.Attribute("id").Value, out el2) &&
        !el.Attributes().Select(a => new { a.Name, a.Value }).Except(
        el2.Attributes().Select(a => new { a.Name, a.Value })).Any()) 
            el.Remove(); 
});
doc2.Save(outfile);

答案 2 :(得分:1)

如果从两个XML文件中创建DOM树,则可以遍历两个树以确保它们的等效性。我确信在C#中有一个DOM库可以让你这样做。

或者,在XSLT中递归遍历它并使用C#中的XSLT库来应用转换并输出后续的XML差异。