Xml Comparison in C#

前端 未结 5 2055
离开以前
离开以前 2020-11-30 05:30

I\'m trying to compare two Xml files using C# code. I want to ignore Xml syntax differences (i.e. prefix names). For that I am using Microsoft\'s XML Diff and Patch C# API.

相关标签:
5条回答
  • 2020-11-30 05:39

    Those documents aren't semantically equivalent. The top-level element of the first is in the http://myNS namespace, while the top-level element of the second is in the default namespace.

    The child elements of the two documents are equivalent. But the documents themselves aren't.

    Edit:

    There's a world of difference between xmls:ns='http://myNS' and xmlns='http://myNS', which I appear to have overlooked. Anyway, those documents are semantically equivalent and I'm just mistaken.

    0 讨论(0)
  • 2020-11-30 05:46

    It might be an idea to load XmlDocument instances from each xml file, and compare the XML DOM instead? Providing the correct validation is done on each, that should give you a common ground for a comparison, and should allow standard difference reporting. Possibly even the ability to update one from the other with the delta.

    0 讨论(0)
  • 2020-11-30 05:49

    The documents are isomorphic as can be shown by the program below. I think if you use XmlDiffOptions.IgnoreNamespaces and XmlDiffOptions.IgnorePrefixes to configure Microsoft.XmlDiffPatch.XmlDiff, you get the result you want.

    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);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 05:52

    I know that you're focus isn't on unit tests, but XMLUnit can compare two XML files and I think it's able to solve your example. Maybe you could look at the code ahd figure out your solution.

    0 讨论(0)
  • 2020-11-30 05:54

    I've got an answer by Martin Honnen in XML and the .NET Framework MSDN Forum. In short he suggests to use XQuery 1.0's deep-equal function and supplies some C# implementations. Seems to work.

    0 讨论(0)
提交回复
热议问题