Comparing XML by nodes names and attributes names in C#

不问归期 提交于 2019-12-18 09:38:58

问题


I want to compare two (or more) XMLs files by tags names and attributes names. I`m not interested by values of attributes or nodes.

Searching on google i found XMLDiff Patch ( http://msdn.microsoft.com/en-us/library/aa302294.aspx ), but it not work for me... or i don`t know how to make settings to work for me. File 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>

File 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>

These two file must be equals.

Thanks!


回答1:


Well if you'd like to do this "manually" an idea would be to use a recursive function and loop through the xml structure. Here is a quick example:

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());

This is your recursive function:

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

Please keep in mind that this will only return true as long as the nodes and attributes are in the same order, and same casing is used on both xml files. You can enhance it to include or exclude attributes/nodes.

Hope it helps!



来源:https://stackoverflow.com/questions/9750879/comparing-xml-by-nodes-names-and-attributes-names-in-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!