C#中的Xml比较

我正在尝试使用C#代码比较两个Xml文件。 我想忽略Xml语法差异(即前缀名称)。 为此,我使用的是Microsoft的XML Diff和Patch C#API。 它适用于某些Xml,但我找不到配置它来使用以下两个Xml的方法:

XML A:

 1  

XML B:

  1  

我的问题是:

  1. 我是对的,这两个xml在语义上是相等的(或同构的)?
  2. 可以配置Microsoft的XML Diff和Patch API来支持它吗?
  3. 还有其他C#实用程序吗?

文档是同构的,如下面的程序所示。 我想如果您使用XmlDiffOptions.IgnoreNamespacesXmlDiffOptions.IgnorePrefixes来配置Microsoft.XmlDiffPatch.XmlDiff ,您将获得所需的结果。

 using System.Linq; using System.Xml.Linq; namespace SO_794331 { class Program { static void Main(string[] args) { var docA = XDocument.Parse( @"1"); var docB = XDocument.Parse( @"1"); var rootNameA = docA.Root.Name; var rootNameB = docB.Root.Name; var equalRootNames = rootNameB.Equals(rootNameA); var descendantsA = docA.Root.Descendants(); var descendantsB = docB.Root.Descendants(); for (int i = 0; i < descendantsA.Count(); i++) { var descendantA = descendantsA.ElementAt(i); var descendantB = descendantsB.ElementAt(i); var equalChildNames = descendantA.Name.Equals(descendantB.Name); var valueA = descendantA.Value; var valueB = descendantB.Value; var equalValues = valueA.Equals(valueB); } } } } 

我知道你关注的不是unit testing,而是XMLUnit可以比较两个XML文件,我认为它能够解决你的例子。 也许你可以看看代码啊你弄清楚你的解决方案。

我得到了Martin Honnen在XML和.NET Framework MSDN论坛上的答案 。 简而言之,他建议使用XQuery 1.0的深度相等function并提供一些C#实现。 似乎工作。

从每个xml文件加载XmlDocument实例可能是一个想法,并比较XML DOM? 对每个进行正确的validation,这应该为您提供比较的共同点,并且应该允许标准差异报告。 可能甚至能够使用delta更新其中一个。

这些文件在语义上不相同。 第一个的顶级元素位于http://myNS命名空间中,而第二个元素的顶级元素位于默认命名空间中。

这两个文件的元素是等价的。 但文件本身并非如此。

编辑:

xmls:ns='http://myNS'xmlns='http://myNS'之间存在着xmlns='http://myNS' ,我似乎忽略了这一点。 无论如何,那些文件在语义上是等价的,我只是错了。