删除Xml文件中的重复节点

时间:2015-07-16 13:46:22

标签: c# xml linq

我需要从xml文档中删除重复的字段。我有这个linq查询,根据是否有多个匹配的id属性收集所有重复项。

代码:

var xtra =
           xdoc.Descendants("Field")
           .GroupBy(g => (string)g.Attribute("id"))
           .Where(g => g.Count() > 1)
           .Select(g => g.Key)
           .ToList();

现在我无法删除只有一次出现的ID。目前我删除它的方式删除了所有出现的情况,因此它不会删除重复项,而是删除重复项和第一次出现的重复项。

知道如何使用linq查询执行此操作吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Skip(1)获取除每个组中第一个元素之外的所有元素,然后在这些选定元素上调用Remove()

xdoc.Descendants("Field")
    .GroupBy(g => (string)g.Attribute("id"))
    .SelectMany(g => g.Skip(1))
    .Remove();

答案 1 :(得分:0)

您需要属性(" id")。您的代码可以使用的值。试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
            "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
            "<Root>" +
              "<Field id =\"1\"></Field>" +
              "<Field id =\"2\"></Field>" +
              "<Field id =\"3\"></Field>" +
              "<Field id =\"1\"></Field>" +
              "<Field id =\"2\"></Field>" +
              "<Field id =\"3\"></Field>" +
              "<Field id =\"4\"></Field>" +
              "<Field id =\"2\"></Field>" +
              "<Field id =\"3\"></Field>" +
              "<Field id =\"4\"></Field>" +
            "</Root>";

            XDocument xdoc = XDocument.Parse(input);

            var xtra =
                xdoc.Descendants("Field")
                .GroupBy(g => g.Attribute("id").Value)
                .Select(x => x.FirstOrDefault())
                .ToList();

        }
    }
}
​