比较XML片段和返回差异
我有一个完整的序列化对象的审计列表,我想比较它们并返回差异列表。 通过’比较’,我的意思是我想返回一个元素的文本已经改变的地方,或者已经添加了一个节点的地方(因此它不在Xml1中,但它在Xml2中 – 它不会反过来发生)
示例xml:
119 1 false 0
名称空间和标签的名称/大小写不会改变。 在此示例中可以更改的是标记之间的值和“CourseHotelLink”(其序列化列表)的数量。
我想要的最终结果是哪个节点已更改的列表 – 旧值和新值。
比较它们的最佳选择是什么? 我使用.Net 4.0所以linq是一个选项。 我需要能够进行比较而不必知道所有节点的名称 – 尽管我只会比较两个相同类型的对象。 我一直在尝试使用以下代码,但我无法适应它来挑选文本中的更改以及额外的节点。
XmlDocument Xml1 = new XmlDocument(); XmlDocument Xml2 = new XmlDocument(); Xml1.LoadXml(list[1].Changes); Xml2.LoadXml(list[2].Changes); foreach (XmlNode chNode in Xml2.ChildNodes) { CompareLower(chNode); } protected void CompareLower(XmlNode aNode) { foreach (XmlNode chlNode in aNode.ChildNodes) { string Path = CreatePath(chlNode); if (chlNode.Name == "#text") { //all my efforts at comparing text have failed continue; } if (Xml1.SelectNodes(Path).Count == 0) { XmlNode TempNode = Xml1.ImportNode(chlNode, true); //node didn't used to exist, this works- though doesn't return values str = str + "New Node: " + TempNode.Name + ": " + TempNode.Value; } else { CompareLower(chlNode); } } }
它可能是我的代码尝试数英里,有一个更好的方法,欢迎任何建议!
编写添加:我最终使用MS Xml Diff Tool,以下代码生成两个xml节点的大型html表列表,其中差异以绿色突出显示。 因此可能(尽管是疯狂的)生成html,然后对其进行排序以找到文本’lightgreen’(突出显示的值),然后执行一些字符串格式以仅显示已更改的子节点。
var node1 = XElement.Parse("Xml string 1 here").CreateReader(); var node2 = XElement.Parse("Xml string 2 here").CreateReader(); MemoryStream diffgram = new MemoryStream(); XmlTextWriter diffgramWriter = new XmlTextWriter(new StreamWriter(diffgram)); XmlDiff xmlDiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder); xmlDiff.Algorithm = XmlDiffAlgorithm.Fast; xmlDiff.Compare(node1, node2,diffgramWriter); diffgram.Seek(0, SeekOrigin.Begin); XmlDiffView xmlDiffView = new Microsoft.XmlDiffPatch.XmlDiffView(); StringBuilder sb = new StringBuilder(); TextWriter resultHtml = new StringWriter(sb); xmlDiffView.Load("Xml string 1", new XmlTextReader(diffgram)); xmlDiffView.GetHtml(resultHtml); resultHtml.Close();
使用XMlDiff是可行的方法 – 在这里certificate它是一些有效的代码。 我正在使用你的XML。 如果XML不同(或无效),则可能无效。
原版的:
var xml1 = @" 119 1 false 0 ";
CourseBookings
Id
值不同:
var xml2 = @" 119 1 false 1 ";
创建读者的努力方法(如果需要,可以更改为XDocument
):
var node1 = XElement.Parse(xml1).CreateReader(); var node2 = XElement.Parse(xml2).CreateReader();
准备结果编写者:
var result = new XDocument(); var writer = result.CreateWriter();
做差异:
var diff = new Microsoft.XmlDiffPatch.XmlDiff(); diff.Compare(node1, node2, writer); writer.Flush(); writer.Close();
result
现在是一个包含差异摘要的XDocument
:
1