在.NET中如何忽略XML比较中的结束标记?

时间:2012-07-11 16:45:58

标签: .net xml comparison

我试图比较两个包含xml

的.NET字符串
<FIRST_NAME type="CHAR" />

<FIRST_NAME type="CHAR"></FIRST_NAME>

如果我按原样比较它们(作为字符串),则会导致错误。我希望比较结果为true,因为在XML中它们在功能上是相同的。我需要做什么才能比较这两个项目(以及其他类似的项目,其中差异是结束标记缺失或存在)返回true?

注意,只要最终结果是返回true的函数/方法,就可以从字符串中转换为某种XML对象/类型,这很好。

3 个答案:

答案 0 :(得分:3)

.NET内置的XML数字签名功能包括一个名为XmlDsigC14NTransform 的类,其目的是将XML转换为规范表示,以便可以比较两个块的相等性。除其他外,它将使自终止元素标准化。您可以阅读more about the various forms of canonicalization it supports

因此,您可以将两个字符串解析为两个XmlDocument实例,通过转换(LoadInput/GetOutput)运行每个字符串,然后比较两个输出:

        void Test()
        {
            string xml1 = @"<FIRST_NAME type=""CHAR"" />";
            string xml2 = @"<FIRST_NAME type='CHAR'></FIRST_NAME>";
            bool areEqual = Compare(xml1,xml2);
        }

        bool Compare(string xml1, string xml2)
        {            
            return Canonicalize(xml1).Equals(Canonicalize(xml2));            
        }

        string Canonicalize(string xml)
        {
            var doc = new XmlDocument();
            doc.LoadXml(xml);
            var xmlTransform = new XmlDsigC14NTransform(true) { Algorithm = SignedXml.XmlDsigExcC14NTransformUrl };
            xmlTransform.LoadInput(doc);
            using( var stream = (Stream)xmlTransform.GetOutput(typeof(Stream)))
            {
                var docOut = new XmlDocument();
                docOut.Load(stream);
                return docOut.DocumentElement.OuterXml;
            }
        }

答案 1 :(得分:0)

使用 Microsoft XML Diff :请参阅以下链接:

答案 2 :(得分:0)

您可以使用XPath 2.0(或XQuery 1.0)deep-equal()函数解析这两个文档并比较生成的文档节点。