从XDocument中删除重复条目

本文关键字:删除 XDocument | 更新日期: 2023-09-27 18:02:30

我有几行像这样的代码:

XDocument rssDocDistinct = new XDocument(new XElement("rss",  
   new XElement("channel", 
      from node in rssDoc.Element("rss").Element("channel").Descendants("item") 
         select node)));

谁能帮我弄清楚如何在rssDoc中只获得不同的"项目"?我不想要任何副本。

谢谢你的帮助。

编辑:

<rss version="2.0">
   <channel>
      <title></title>
      <link></link>
      <description></description>
      <copyright></copyright>
      <ttl></ttl>
      <item>
         <title></title>
         <description></description>
         <link></link>
         <pubDate></pubDate>
      </item>
      <item>
         <title></title>
         <description> </description>
         <link></link>
         <pubDate></pubDate>
      </item>
    </channel>
</rss>

rssDocDistinct应该是这样的,没有重复的item元素(具有相同标题、链接、描述、pubDate的item只会出现一次)

  <item>
     <title></title>
     <description></description>
     <link></link>
     <pubDate></pubDate>
  </item>
  <item>
     <title></title>
     <description> </description>
     <link></link>
     <pubDate></pubDate>
  </item>

编辑:谢谢你的帮助,我得到了它通过弄清楚如何使一个IEqualityComparer polishchuc建议。

public class ItemComparer : IEqualityComparer<XElement>
    {
        #region IEqualityComparer<XElement> Members
        public bool Equals(XElement x, XElement y)
        {
            return (string)x.Element("title") == (string)y.Element("title")
                && (string)x.Element("description") == (string)y.Element("description")
                && (string)x.Element("link") == (string)y.Element("link")
                && (string)x.Element("pubDate") == (string)y.Element("pubDate");
        }
        public int GetHashCode(XElement obj)
        {
            return ((string)obj.Element("title")).GetHashCode()
                + ((string)obj.Element("description")).GetHashCode()
                + ((string)obj.Element("link")).GetHashCode()
                + ((string)obj.Element("pubDate")).GetHashCode();
        }
        #endregion
    }

从XDocument中删除重复条目

查看Enumerable.Distinct扩展方法。实现您自己的IEqualityComparer<XElement>或(最好)继承EqualityComparer<T>类,根据您的需要使用自己的不同逻辑。使用它,例如:

var comparer = new YourXElementComparer();
XDocument rssDocDistinct = new XDocument(new XElement("rss",  
   new XElement("channel", 
      from node in rssDoc.Element("rss").Element("channel").Descendants("item")
            .Distinct(comparer) 
         select node)));