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