比较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#吗?
您可能需要查看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。