如何使用C#代码消除重复的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

我有一个模式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" />    
</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
文件中出现的顺序单独命名?或者,所有属性和子节点是否也必须相同才能相同?