【问题标题】:In .NET how do I ignore end tags in an XML comparison?在 .NET 中,如何忽略 XML 比较中的结束标记?
【发布时间】:2012-07-11 16:45:58
【问题描述】:

我正在尝试比较两个包含 xml 的 .NET 字符串

<FIRST_NAME type="CHAR" />

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

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

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

【问题讨论】:

    标签: .net xml comparison


    【解决方案1】:

    .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;
                }
            }
    

    【讨论】:

    • 您能否提供一个示例,从字符串到 xml 的比较结果为真?我很难按照 msdn 网站上的示例文档进行操作。
    • 添加了代码示例。请注意它如何处理属性值周围的单引号和双引号之间的差异。
    • 太棒了,现在试试,谢谢。 “{algorithm...}”行是做什么的?
    • 查看上面答案中的第二个超链接。它精确控制用于规范化的规则集(除其他外,是否包括 XML cmets)
    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2016-11-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 2015-06-11
        • 2011-02-24
        相关资源
        最近更新 更多