C#中的Xml比较
我正在尝试使用C#代码比较两个Xml文件。 我想忽略Xml语法差异(即前缀名称)。 为此,我使用的是Microsoft的XML Diff和Patch C#API。 它适用于某些Xml,但我找不到配置它来使用以下两个Xml的方法:
XML A:
1
XML B:
1
我的问题是:
- 我是对的,这两个xml在语义上是相等的(或同构的)?
- 可以配置Microsoft的XML Diff和Patch API来支持它吗?
- 还有其他C#实用程序吗?
文档是同构的,如下面的程序所示。 我想如果您使用XmlDiffOptions.IgnoreNamespaces
和XmlDiffOptions.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'
,我似乎忽略了这一点。 无论如何,那些文件在语义上是等价的,我只是错了。