0

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

<FIRST_NAME type="CHAR" />

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

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

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

4

3 回答 3

3

.NET 中内置的 XML 数字签名功能包括一个名为XmlDsigC14NTransform的类,其目的是将 XML 转换为规范表示,以便可以比较两个块的相等性。除其他外,它将规范化自终止元素。您可以阅读有关它支持的各种形式的规范化的更多信息

因此,您可以将两个字符串解析为两个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;
            }
        }
于 2012-07-11T16:53:02.597 回答
0

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

于 2012-07-11T21:34:41.150 回答
0

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

于 2012-07-11T17:38:52.300 回答