Comparing XML by nodes names and attributes names in C#

倾然丶 夕夏残阳落幕 提交于 2019-11-29 18:04:39

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!

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