是否可以比较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#?
答案 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差异。