如何比较两个xmls

时间:2011-07-28 23:06:58

标签: c# xml

我有一个xml文件,如下例所示

<Ids>
   <Id>
      <set>ai</set>
      <idN>2000</idN>
      <Desc>Node</Desc>
      <tabs>
         <tab>
            <tabName>na</tabName>
            <tabAlias>na</tabAlias>
            <tabQualifier>SCH</tabQualifier>
         </tab>
      </tabs>
      <cls>
         <cl>
            <cName>def</cName>
            <cLName>term</clName>
            <clPos>0</clPos>
            <tabName>nodeassign</tabName>
            <clType>C</clType>
            <dName></dName>
            <dI>
               <dB>0</dB>
               <gd>0</gd>
               <gdgR></gdgR>
               <gCol></gCol>
            </dI>
         </cl>
         <cl>
            <cName>default</cName>
            <cLName>mux_id</cLName>
            <clPos>1</clPos>
            <tabName>nodeassign</tabName>
            <clType>I</clType>
            <dName></dName>
            <dI>
               <dB>0</dB>
               <gd>0</gd>
               <gdgR></gdgR>
               <gCol></gCol>
            </dI>
         </cl>
      </cls>
   </Id>
</Ids>

这只是大型xml文件的一部分。我必须比较两个xml文件,并且应该能够将两个文件中的所有差异转换为单独的xml。如果它们与其他xml文件不同,应该能够更改少数元素的值。

首先,我按照以下链接http://www.daniweb.com/software-development/csharp/threads/46345中的建议进行操作。但是当我为给定的xml生成数据集时,在数据集中创建了许多表(如Ids,id,cls,cl,di,tabs ...)。我不明白如何建立表之间的关系。还不明白生成的表中的哪一列成为主键,以便我可以依赖它。上面链接中提供的示例是一个简单的xml,因此作者能够轻松解决问题。

但我所拥有的xml有点复杂。任何帮助非常感谢。

感谢。

1 个答案:

答案 0 :(得分:0)

我遵循了给定链接中指定的类似解决方案,并且能够解决我的问题。但我仍在努力。

当我创建数据集并加载我的xml时,会在数据集中创建以下关系,并且我可以在其他行中导航。创建的关系如下:

Ids_Id
Id_tabs
tabs_tab
Id_cls
cls_cl

示例代码如下:

public void CompareXml()
{
    DataSet xml1DS = new DataSet("Xml1");
    DataSet xml2DS = new DataSet("Xml2");   
    DataSet outputDS = new DataSet("Output");       

    //read in our files
    try
    {
        xml1DS.ReadXml(@"C:\xml1.xml", XmlReadMode.Auto);
        xml2DS.ReadXml(@"C:\xml2.xml", XmlReadMode.Auto);
    }
    catch (Exception)
    {

    }

    outputXML = xml2DS;

    IEqualityComparer<DataRow> comparer = DataRowComparer.Default;

    foreach (DataRow row1 in xml1DS.Tables["Id"].Rows)
    {
        bool hasRow = false;
        foreach (DataRow row2 in xml2DS.Tables["Id"].Rows)
        {
            try
            {
                if ((string)row1["idN"] == (string)row2["idN"])
                {
                    DataRow[] Child1 = row1.GetChildRows("Id_cls")[0].GetChildRows("cls_cl");
                    DataRow[] Child2 = row2.GetChildRows("Id_cls")[0].GetChildRows("cls_cl");

                    foreach (var v in Child1)
                    {
                        foreach (var t in Child2)
                        {
                            //string str = v.GetParentRow("columns_column").GetParentRow("configId_columns")["idNumber"].ToString();


                            if ((v["clPos"].ToString() == t["clPos"].ToString()) &&
                                (v["cLName"].ToString() == t["cLName"].ToString())
                                )
                            {
                                hasRow = true;

                                if (IsColumnNodeEqual(v, t) == false)
                                {
                                    t["cName"] = "###";
                                }
                                break;
                            }
                        }
                    }
                }
            }
            catch(Exception)
            {
            }

        }

        if(!hasRow) 
        {

        }
    }

    //write it to the xml file
    outputXML.WriteXml("newXML.xml");

 }

即使这种方法效率低下,但我也很容易扩展和维护代码。这个代码是如何为我的一个xmls编写工具的。