[英]Xml Comparison in C#
我正在尝试使用C#代码比较两个Xml文件。 我想忽略Xml语法差异(即前缀名称)。 为此我使用的是Microsoft的XML Diff和Patch C#API。 它适用于某些Xml,但我找不到配置它来使用以下两个Xml的方法:
XML A:
<root xmlns:ns="http://myNs">
<ns:child>1</ns:child>
</root>
XML B:
<root>
<child xmlns="http://myNs">1</child>
</root>
我的问题是:
这些文件是同构的,如下面的程序所示。 我想如果你使用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(
@"<root xmlns:ns=""http://myNs""><ns:child>1</ns:child></root>");
var docB = XDocument.Parse(
@"<root><child xmlns=""http://myNs"">1</child></root>");
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);
}
}
}
}
我知道你关注的不是单元测试,而是XMLUnit可以比较两个XML文件,我认为它能够解决你的例子。 也许你可以看看代码啊你弄清楚你的解决方案。
我得到了Martin Honnen在XML和.NET Framework MSDN论坛上的答案 。 简而言之,他建议使用XQuery 1.0的深度相等功能并提供一些C#实现。 似乎工作。
从每个xml文件加载XmlDocument实例可能是一个想法,并比较XML DOM? 对每个进行正确的验证,这应该为您提供进行比较的共同点,并且应该允许标准差异报告。 可能甚至能够用delta更新另一个。
这些文件在语义上不相同。 第一个的顶级元素位于http://myNS
命名空间中,而第二个元素的顶级元素位于默认命名空间中。
这两个文件的子元素是等价的。 但文件本身并非如此。
编辑:
xmls:ns='http://myNS'
和xmlns='http://myNS'
之间存在着xmlns='http://myNS'
,我似乎忽略了这一点。 无论如何,那些文件在语义上是等价的,我只是错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.