2012-02-29 146 views
0

是否可以比较2个XML文件并仅用增量生成XML?比较2个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#?

+1

它绝对可以做到。你试过什么了? – 2012-02-29 19:56:44

+0

其实没有什么,真的不知道如何访问这样的事情,我相信有人已经这样做过.. – 2012-02-29 19:59:54

+0

我会看着XmlReader,并可能读入这两个文件这种方式到一些其他的数据结构,并通过检查差异,最后使用XmlWriter输出结果。 – user17753 2012-02-29 19:59:59

回答

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); 
3

你可能要检查出的xmldiff补丁和GUI工具。它可以让你比较2个XML文件 - http://msdn.microsoft.com/en-us/library/aa302295.aspx

有在本页面顶部的下载链接为一个可执行文件 - http://msdn.microsoft.com/en-us/library/aa302294.aspx

+0

有没有我可以使用的任何DLL?我无法找到下载页面...你能帮忙吗?你使用这个工具吗? – 2012-02-29 20:21:44

+0

我编译了它,并在https://bitbucket.org/opticyclic/xmldiffpatchgui/overview上提供了一个安装程序 – opticyclic 2013-06-18 14:19:29

1

如果创建一个DOM树了两个XML文件,你可以穿越两棵树,以确保它们的等价。我相信C#中有一个DOM库,可以让你做到这一点。

或者,递归遍历它在XSLT并使用XSLT库在C#到应用变换,并输出随后的XML差异。