我需要从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查询执行此操作吗?
答案 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();
}
}
}