c# - 有效地删除 c# 中的重复 xml 元素

标签 c# xml

我有几个包含大量重复条目的 XML 文件,例如这些。

<annotations>
  <annotation value=",Clear,Outdoors" eventID="2">
    <image location="Location 1" />
    <image location="Location 2" />
    <image location="Location 2" />
  </annotation>

  <annotation value=",Not a problem,Gravel,Shopping" eventID="2">
    <image location="Location 3" />
    <image location="Location 4" />
    <image location="Location 5" />
    <image location="Location 5" />
    <image location="Location 5" />
  </annotation>
</annotations>

我想删除每个子元素中的重复元素。我解决这个问题的方法是将所有元素复制到一个列表中,然后比较它们,

 foreach (var el in xdoc.Descendants("annotation").ToList())
   {
      foreach (var x in el.Elements("image").Attributes("location").ToList())
       {
           //add elements to a list
       }
   }

进行到一半我意识到这是非常低效和耗时的。我是 XML 的新手,我想知道 C# 中是否有任何内置方法可用于删除重复项?

我试过用

if(!x.value.Distinct()) // can't convert collections to bool
    x.Remove();

但这不管用,也不行

if(x.value.count() > 1) // value.count returns the number of elements.
   x.Remove()

最佳答案

using System.Xml.Linq;

XDocument xDoc = XDocument.Parse(xmlString);
xDoc.Root.Elements("annotation")
         .SelectMany(s => s.Elements("image")
                           .GroupBy(g => g.Attribute("location").Value)
                           .SelectMany(m => m.Skip(1))).Remove();

关于c# - 有效地删除 c# 中的重复 xml 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25812456/

相关文章:

c# - 为什么初始化自动实现的属性在 .net 2.0 中有效?

c# - 帮助为我的应用程序创建/调试 C# 许可证服务器

sql-server - MSSQL查询Xml差异顺序

c# - XML 和 & 字符

xml - 使用Hadoop解析xml,与HTML相比有多难?

javascript - 从php->mysql节点中xml的深度

C# 三角数优化

c# - 如果将回调分配给对象两次,事件是否会执行两次?

c# - 这是一个好的 REST URI 吗?

python - 不明白为什么一个 XML 字段会出现 AttributeError 而其他字段却不会