Csharp/C#教程:有效删除c#中的重复xml元素分享


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

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

              

我想删除每个子节点中的重复元素。 我接近这个的方法是将所有元素复制到列表然后比较它们,

  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(); 

如果您的副本总是采用这种forms,那么您可以使用一些XSLT来删除重复的节点。 这个XSLT是:

         

如果它经常发生,那么将样式表加载到XslCompiledTransform实例中可能是值得的。

或者您可以使用此XPath简单地获取所有重复节点的列表:

 /annotations/annotation/image[@location = preceding-sibling::image/@location] 

并从父母中删除它们。

你可以在这里做几件事。 除了到目前为止的其他答案,你可以注意到Distinct()有一个带有IEqualityComparer的重载。 您可以使用类似这样的ProjectionEqualityComparer来执行以下操作:

 var images = xdoc.Descendants("image") .Distinct(ProjectionEqualityComparer.Create(xe => xe.Attributes("location").First().Value)) 

…它将为您提供具有唯一位置属性的所有独特“图像”元素。

上述就是C#学习教程:有效删除c#中的重复xml元素分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957396.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐