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

在.NET中,如何在XML比较中忽略结束标记?,.net,xml,comparison,.net,Xml,Comparison,我试图比较两个包含xml的.NET字符串 <FIRST_NAME type="CHAR" /> 及 如果我按原样比较它们(作为字符串),则结果为false。我希望比较结果为true,因为在XML中,它们在功能上是相同的。我需要做什么才能使这两个项目的比较(以及其他类似的项目,其中差异是缺少结束标记或存在)返回真值 请注意,只要最终结果是返回true的函数/方法,就可以从字符串转换成某种类型的XML对象/类型。内置在.NET中的XML数字签名功能包括一个名为的类,其目的是将X

我试图比较两个包含xml的.NET字符串

<FIRST_NAME type="CHAR" />


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


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

内置在.NET中的XML数字签名功能包括一个名为的类,其目的是将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;
            }
        }
void测试()
{
字符串xml1=@;
字符串xml2=@;
bool areEqual=Compare(xml1,xml2);
}
布尔比较(字符串xml1、字符串xml2)
{            
返回规范化(xml1).Equals(规范化(xml2));
}
字符串规范化(字符串xml)
{
var doc=新的XmlDocument();
doc.LoadXml(xml);
var xmlTransform=new XmlDsigC14NTransform(true){Algorithm=SignedXml.XmlDsigExcC14NTransformUrl};
加载输入(doc);
使用(var stream=(stream)xmlTransform.GetOutput(typeof(stream)))
{
var docOut=new XmlDocument();
加载(流);
返回docOut.DocumentElement.OuterXml;
}
}

内置在.NET中的XML数字签名功能包括一个名为的类,其目的是将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;
            }
        }
void测试()
{
字符串xml1=@;
字符串xml2=@;
bool areEqual=Compare(xml1,xml2);
}
布尔比较(字符串xml1、字符串xml2)
{            
返回规范化(xml1).Equals(规范化(xml2));
}
字符串规范化(字符串xml)
{
var doc=新的XmlDocument();
doc.LoadXml(xml);
var xmlTransform=new XmlDsigC14NTransform(true){Algorithm=SignedXml.XmlDsigExcC14NTransformUrl};
加载输入(doc);
使用(var stream=(stream)xmlTransform.GetOutput(typeof(stream)))
{
var docOut=new XmlDocument();
加载(流);
返回docOut.DocumentElement.OuterXml;
}
}

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


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


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

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

您能否提供一个从字符串到xml比较的示例,得出true?我很难理解msdn网站上的示例文档。添加了代码示例。请注意它是如何处理属性值周围的单引号和双引号之间的差异的。太棒了,现在试试吧,谢谢。“{algorithm…}”行的作用是什么?请参阅上面答案中的第二个超链接。它精确地控制用于规范化的一组规则(是否包括XML注释等),您能提供一个从字符串到XML比较的示例吗?我很难理解msdn网站上的示例文档。添加了代码示例。请注意它是如何处理属性值周围的单引号和双引号之间的差异的。太棒了,现在试试吧,谢谢。“{algorithm…}”行的作用是什么?请参阅上面答案中的第二个超链接。它精确地控制用于规范化的规则集(是否包括XML注释等)