使用基于属性值的LINQ对XML进行重复数据删除

时间:2015-02-19 12:03:32

标签: c# xml linq linq-to-xml

我有这样的XML:

<rewriteMaps>
  <rewriteMap name="RewritesInSightContentaltecNL">
    <add key="/tata" value="/productdetails.aspx?id=1628" />
    <add key="/tata" value="/productdetails.aspx?id=1628" />
    <add key="/marc" value="/productdetails.aspx?id=1626" />
    <add key="/marc" value="/productdetails.aspx?id=1626" />
    <add key="/marc" value="/productdetails.aspx?id=1626" />

    <add key="/henk" value="/productdetails.aspx?id=162996" />
    <add key="/henk" value="/productdetails.aspx?id=1aa6" />

    <add key="/tata" value="/productdetails.aspx?id=1628" />
    <add key="/tata" value="/productdetails.aspx?id=1628" />
    <add key="/marc" value="/productdetails.aspx?id=1626" />
    <add key="/marc" value="/productdetails.aspx?id=1626" />
    <add key="/aaaa" value="/productdetails.aspx?id=xxxx" />
  </rewriteMap>

  </rewriteMaps>

我想根据“key”属性“

删除重复值

所以我想最终:

 <add key="/tata" value="/productdetails.aspx?id=1628" />
 <add key="/marc" value="/productdetails.aspx?id=1626" />
 <add key="/henk" value="/productdetails.aspx?id=162996" />
 <add key="/aaaa" value="/productdetails.aspx?id=xxxx" />

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

使用Remove扩展方法。此方法将从文档中删除所有选定的节点。试试这段代码。

xdoc.Root.Elements("add")
.GroupBy(s => (string)s.Element("value"))
.SelectMany(g => g.Skip(1)) // select all nodes from group except first one
.Remove();

答案 1 :(得分:0)

XElement rewriteMaps = XElement.Parse(xmlToParse);
var distinct data= rewriteMaps.Descendants("rewriteMap")
                                    .Elements()
                                    .GroupBy(x=> new { key = (string)x.Attribute("key"), value = (string)x.Attribute("value")})
                                    .Select(x=> x.FirstOrDefault());

这会给你

  <add key="/tata" value="/productdetails.aspx?id=1628" /> 
  <add key="/marc" value="/productdetails.aspx?id=1626" /> 
  <add key="/henk" value="/productdetails.aspx?id=162996" /> 
  <add key="/henk" value="/productdetails.aspx?id=1aa6" /> 
  <add key="/aaaa" value="/productdetails.aspx?id=xxxx" />