比较2个XML文件

本文关键字:文件 XML 2个 比较 | 更新日期: 2023-09-27 18:26:16

是否可以比较两个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#吗?

比较2个XML文件

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

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

这个特殊的例子很容易得到区别。如果真正的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);

如果您用两个XML文件创建一个DOM树,您可以遍历这两个树以确保它们的等价性。我相信C#中有一个DOM库可以让您做到这一点。

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