如何使用C#代码消除重复的XML节点
我有一个模式XML文件,其中包含表、列和外键的节点,如下所示如何使用C#代码消除重复的XML节点,c#,xml,linq,duplicates,element,C#,Xml,Linq,Duplicates,Element,我有一个模式XML文件,其中包含表、列和外键的节点,如下所示 <Table schema="Reports_vN" name="pstpyr" caption="PR Payroll Posting"> <Column name="recnum" alias="Record Number" isprimarykey="1" /> <Column name="pstnum" alias="Posting Number" /> </T
<Table schema="Reports_vN" name="pstpyr" caption="PR Payroll Posting">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="pstnum" alias="Posting Number" />
</Table>
<Table schema="Reports_vN" name="payrec" caption="PR Payroll Record">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="empnum" alias="Employee" />
<Column name="strprd" alias="Period Start" />
<ForeignKey pkSchema="Reports_vN" pkTable="payrec" fkSchema="Reports_vN" fkTable="tmcdln" name="Record Number">
<ForeignKeyCol pkCol="recnum" fkCol="recnum" />
</ForeignKey>
<ForeignKey pkSchema="Reports_vN" pkTable="payrec" fkSchema="Reports_vN" fkTable="jobcst" name="Payroll Number">
<ForeignKeyCol pkCol="recnum" fkCol="payrec" />
</ForeignKey>
<ForeignKey pkSchema="Reports_vN" pkTable="payrec" fkSchema="Reports_vN" fkTable="jobcst" name="Payroll Number">
<ForeignKeyCol pkCol="recnum" fkCol="payrec" />
</ForeignKey>
</Table>
正如上面所观察到的,它包含重复的元素(最后两个外键)。我是LINQ的新手。有人可以分享一个示例,我可以使用它从XML文件中删除这个重复的元素。首先,您的
XML
格式不好。您有多个根节点,这是非法的。
节点应位于一个根节点下
然后,您还没有完全定义什么是重复节点。它仅仅是重复的节点名吗?或者节点子节点和属性也必须相同吗
1.仅按节点(元素)名称复制
这很容易。通过该名称获取所有元素,然后执行Skip(1)
跳过第一个元素,并删除其余元素
XDocument xDoc = XDocument.Load("data.xml");
xDoc.Root.Descendants("ForeignKey").Skip(1).Remove();
现在,XML
如下所示:
<MyRoot>
<Table schema="Reports_vN" name="pstpyr" caption="PR Payroll Posting">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="pstnum" alias="Posting Number" />
</Table>
<Table schema="Reports_vN" name="payrec" caption="PR Payroll Record">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="empnum" alias="Employee" />
<Column name="strprd" alias="Period Start" />
<ForeignKey pkSchema="Reports_vN" pkTable="payrec" fkSchema="Reports_vN" fkTable="tmcdln" name="Record Number">
<ForeignKeyCol pkCol="recnum" fkCol="recnum" />
</ForeignKey>
</Table>
</MyRoot>
MyRoot xml = DeserializeXMLFileToObject<MyRoot>("data.xml");
现在,您可以使用以下方法来反序列化XML
public static T DeserializeXMLFileToObject<T>(string XmlFilename)
{
T returnObject = default(T);
if (string.IsNullOrEmpty(XmlFilename)) return default(T);
try
{
StreamReader xmlStream = new StreamReader(XmlFilename);
XmlSerializer serializer = new XmlSerializer(typeof(T));
returnObject = (T)serializer.Deserialize(xmlStream);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return returnObject;
}
public static T反序列化XmlFileToObject(字符串XmlFilename)
{
T returnObject=默认值(T);
if(string.IsNullOrEmpty(XmlFilename))返回默认值(T);
尝试
{
StreamReader xmlStream=新的StreamReader(XmlFilename);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
returnObject=(T)序列化程序。反序列化(xmlStream);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
返回对象;
}
可以这样称呼:
<MyRoot>
<Table schema="Reports_vN" name="pstpyr" caption="PR Payroll Posting">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="pstnum" alias="Posting Number" />
</Table>
<Table schema="Reports_vN" name="payrec" caption="PR Payroll Record">
<Column name="recnum" alias="Record Number" isprimarykey="1" />
<Column name="empnum" alias="Employee" />
<Column name="strprd" alias="Period Start" />
<ForeignKey pkSchema="Reports_vN" pkTable="payrec" fkSchema="Reports_vN" fkTable="tmcdln" name="Record Number">
<ForeignKeyCol pkCol="recnum" fkCol="recnum" />
</ForeignKey>
</Table>
</MyRoot>
MyRoot xml = DeserializeXMLFileToObject<MyRoot>("data.xml");
MyRoot xml=DeserializeXMLFileToObject(“data.xml”);
现在的问题是使用简单的
C
技术来查找和删除重复项。最简单的方法是编写一个比较器
,这样您就可以轻松地比较多个对象。首先,您的XML
格式不好。您有多个根节点,这是非法的。
节点应位于一个根节点下。然后,您还没有完全定义什么是重复节点。是否仅仅是第一个节点之后的节点,按照它在XML
文件中出现的顺序单独命名?或者,所有属性和子节点是否也必须相同才能相同?