我有一个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有点复杂。任何帮助非常感谢。
感谢。
答案 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编写工具的。