【问题标题】:Comparing XML by nodes names and attributes names in C#在 C# 中按节点名称和属性名称比较 XML
【发布时间】:2012-03-17 14:45:10
【问题描述】:

我想通过标签名称和属性名称来比较两个(或更多)XML 文件。我对属性或节点的值不感兴趣。

在谷歌上搜索我找到了 XMLDiff 补丁 (http://msdn.microsoft.com/en-us/library/aa302294.aspx),但它对我不起作用......或者我不知道如何进行设置以适合我。 档案A

    <info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum attribute="some_val">1</LNameNum>
      <NumPeople>1</NumPeople>
      <NameType/>
      <LName>TEST</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>B test</Comment>
    </Segment>
  </Retrieve>
</info>

文件 B

<info>
  <Retrieve>
    <LastNameInfo>
      <LNameNum attribute="other_val">4</LNameNum>
      <NumPeople>1</NumPeople>
      <NameType/>
      <LName>TEST7</LName>
    </LastNameInfo>
    <Segment>
      <SegNum>1</SegNum>
      <Comment>A test</Comment>
    </Segment>
    <Segment>
      <SegNum>2</SegNum>
      <Dt>20110910</Dt>
      <Comment>B test</Comment>
    </Segment>
  </Retrieve>
</info>

这两个文件必须相等。

谢谢!

【问题讨论】:

  • 你只需要知道它们是否不同,还是你也需要知道它们的区别?
  • @Lloyd,好吧 Linq 有 DeepEquals 函数,但是如果属性值或节点值不同,则返回 fals。 @Reinaldo,只要不同。
  • Xmldiffpatch.exe 对您不起作用是什么意思?
  • 也许我不知道如何设置 XmlDiffOptions 来忽略属性和节点的值。

标签: c# xml xmldiff


【解决方案1】:

如果您想“手动”执行此操作,一个想法是使用递归函数并循环遍历 xml 结构。这是一个简单的例子:

var xmlFileA = //first xml
var xmlFileb = // second xml

var docA = new XmlDocument();
var docB = new XmlDocument();

docA.LoadXml(xmlFileA);
docB.LoadXml(xmlFileb);

var isDifferent = HaveDiferentStructure(docA.ChildNodes, docB.ChildNodes);
Console.WriteLine("----->>> isDifferent: " + isDifferent.ToString());

这是你的递归函数:

private bool HaveDiferentStructure(
            XmlNodeList xmlNodeListA, XmlNodeList xmlNodeListB)
{
    if(xmlNodeListA.Count != xmlNodeListB.Count) return true;                

    for(var i=0; i < xmlNodeListA.Count; i++)
    {
         var nodeA = xmlNodeListA[i];
         var nodeB = xmlNodeListB[i];

         if (nodeA.Attributes == null)
         {
              if (nodeB.Attributes != null)
                   return true;
              else
                   continue;
         }

         if(nodeA.Attributes.Count != nodeB.Attributes.Count 
              || nodeA.Name != nodeB.Name) return true;

         for(var j=0; j < nodeA.Attributes.Count; j++)
         {
              var attrA = nodeA.Attributes[j];
              var attrB = nodeB.Attributes[j];

              if (attrA.Name != attrB.Name) return true;
          }

          if (nodeA.HasChildNodes && nodeB.HasChildNodes)
          {
              return HaveDiferentStructure(nodeA.ChildNodes, nodeB.ChildNodes);
          }
          else
          {
              return true;
          }
     }
     return false;
}

请记住,只要节点和属性的顺序相同,并且两个 xml 文件使用相同的大小写,这只会返回 true。您可以对其进行增强以包含或排除属性/节点。

希望对你有帮助!

【讨论】:

  • 我希望直到最后一刻我不需要手动执行这些操作。我知道这个解决方案,但我希望找到一个图书馆。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多