比较2个XML文件
是否可以比较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#?
这个特殊的例子是很容易得到的差异进行。如果真正的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);
你可能要检查出的xmldiff补丁和GUI工具。它可以让你比较2个XML文件 - http://msdn.microsoft.com/en-us/library/aa302295.aspx
有在本页面顶部的下载链接为一个可执行文件 - http://msdn.microsoft.com/en-us/library/aa302294.aspx
有没有我可以使用的任何DLL?我无法找到下载页面...你能帮忙吗?你使用这个工具吗? – 2012-02-29 20:21:44
我编译了它,并在https://bitbucket.org/opticyclic/xmldiffpatchgui/overview上提供了一个安装程序 – opticyclic 2013-06-18 14:19:29
如果创建一个DOM树了两个XML文件,你可以穿越两棵树,以确保它们的等价。我相信C#中有一个DOM库,可以让你做到这一点。
或者,递归遍历它在XSLT并使用XSLT库在C#到应用变换,并输出随后的XML差异。
它绝对可以做到。你试过什么了? – 2012-02-29 19:56:44
其实没有什么,真的不知道如何访问这样的事情,我相信有人已经这样做过.. – 2012-02-29 19:59:54
我会看着XmlReader,并可能读入这两个文件这种方式到一些其他的数据结构,并通过检查差异,最后使用XmlWriter输出结果。 – user17753 2012-02-29 19:59:59