我试图比较两个包含xml
的.NET字符串<FIRST_NAME type="CHAR" />
和
<FIRST_NAME type="CHAR"></FIRST_NAME>
如果我按原样比较它们(作为字符串),则会导致错误。我希望比较结果为true,因为在XML中它们在功能上是相同的。我需要做什么才能比较这两个项目(以及其他类似的项目,其中差异是结束标记缺失或存在)返回true?
注意,只要最终结果是返回true的函数/方法,就可以从字符串中转换为某种XML对象/类型,这很好。
答案 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()函数解析这两个文档并比较生成的文档节点。