当前位置: 首页 > 编程语言 > C#

比较XML片段和返回差异分享

时间:2023-04-10 18:50:53 C#

比较XML片段和返回差异我有一个序列化对象的完整审计列表,我想比较它们并返回一个差异列表。通过“比较”,我的意思是我想返回元素的文本已更改的位置,或者已添加节点的位置(因此它不在Xml1中,但它在Xml2中-它不会以相反的方式发生)示例xml:1191false0命名空间和标签的名称/大小写不会改变。在此示例中可以更改的是标签之间的值和“CourseHotelLink”(其序列化列表)的编号。我想要的最终结果是哪个节点已更改的列表-旧值和新值。比较它们的最佳选择是什么?我使用.Net4.0,所以linq是一个选项。我需要能够在不知道所有节点名称的情况下进行比较——尽管我只会比较两个相同类型的对象。我一直在尝试使用以下代码,但我无法调整它来挑选文本中的更改以及额外的节点。XmlDocumentXml1=newXmlDocument();XmlDocumentXml2=newXmlDocument();Xml1.LoadXml(列表[1].变化);Xml2.LoadXml(列表[2].变化);foreach(Xml2.ChildNodes中的XmlNodechNode){CompareLower(chNode);}protectedvoidCompareLower(XmlNodeaNode){foreach(XmlNodechlNodeinaNode.ChildNodes){stringPath=CreatePath(chlNode);if(chlNode.Name=="#text"){//我所有比较文本的努力都失败了continue;}if(Xml1.SelectNodes(Path).Count==0){XmlNodeTempNode=Xml1.ImportNode(chlNode,true);//node以前不存在,这个可以用——虽然不返回值str=str+"NewNode:"+TempNode.Name+":"+TempNode.Value;}else{CompareLower(chlNode);可能是我的代码尝试了数英里,有一个更好的方法,欢迎任何建议!写入添加:我最终使用了MSXml差异工具,下面的代码生成了一个包含两个xml节点的大型html表列表,其中差异以绿色突出显示。所以有可能(尽管很疯狂)生成html,然后对其进行排序以找到文本“lightgreen”(突出显示的值),然后进行一些字符串格式化以仅显示已更改的子节点。varnode1=XElement.Parse("Xmlstring1here").CreateReader();varnode2=XElement.Parse("Xmlstring2here").CreateReader();MemoryStreamdiffgram=newMemoryStream();XmlTextWriterdiffgramWriter=newXmlTextWriter(newStreamWriter(diffgram));XmlDiffxmlDiff=newXmlDiff(XmlDiffOptions.IgnoreChildOrder);xmlDiff.Algorithm=XmlDiffAlgorithm.Fast;xmlDiff.Compare(node1,node2,diffgramWriter);diffgram.Seek(0,SeekOrigin.Begin);XmlDiffViewxmlDiffView=newMicrosoft.XmlDiffPatch.XmlDiffView();StringBuildersb=newStringBuilder();TextWriterresultHtml=newStringWriter(sb);xmlDiffView.Load("Xml字符串1",newXmlTextReader(diffgram));xmlDiffView.GetHtml(resultHtml);resultHtml.Close();使用XMlDiff是可行的方法-这里证明它是一些有效的代码。我正在使用您的XML。如果XML不同(或无效),则它可能无效。原文:varxml1=@"1191false0";CourseBookingsId值不同:varxml2=@"1191false1";创建阅读器的努力方法(如果需要可以更改为XDocument):varnode1=XElement。解析(xml1).CreateReader();varnode2=XElement.Parse(xml2).CreateReader();准备结果编写器:varresult=newXDocument();varwriter=result.CreateWriter();做差异:vardiff=newMicrosoft.XmlDiffPatch.XmlDiff();diff.Compare(node1,node2,writer);writer.Flush();writer.Close();result现在是一个XDocument,里面包含了差异总结:XML片段和返回差异分享的全部内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—1本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: