2012-07-11 99 views
0

我试图比较包含XML在.NET中如何忽略XML比较中的结束标记?

<FIRST_NAME type="CHAR" /> 

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

如果我对它们进行比较,因为它们是(字符串)它会导致假两个.NET字符串。我希望比较结果是正确的,因为在XML中它们在功能上是相同的。我需要做什么以便比较这两个项目(以及其他类似的项目,其中的差异是结束标记缺失还是存在)是否返回true?

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

回答

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; 
      } 
     } 
+0

你能提供一个从字符串到xml比较的例子吗?我在msdn网站上的示例文档中遇到困难。 – n00b 2012-07-11 18:09:22

+0

添加代码示例。请注意它如何处理属性值周围的单引号和双引号之间的差异。 – jlew 2012-07-11 18:55:41

+0

真棒,现在试一试,谢谢。 “{算法...}”行有什么作用? – n00b 2012-07-11 19:44:06

0

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