C#中的Xml比较

Yar*_*veh 13 c# xml

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

XML A:

<root xmlns:ns="http://myNs">
  <ns:child>1</ns:child>
</root>
Run Code Online (Sandbox Code Playgroud)

XML B:

<root>
  <child xmlns="http://myNs">1</child>
</root>
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Ron*_*erg 10

这些文件是同构的,如下面的程序所示.我想如果你使用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(
                @"<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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Yar*_*veh 2

我在 XML 和 .NET Framework MSDN 论坛中得到了Martin Honnen 的回答。简而言之,他建议使用 XQuery 1.0 的 deep-equal 函数并提供一些 C# 实现。似乎有效。