从XDocument中删除重复的条目

时间:2011-07-20 00:57:23

标签: c# .net xml linq xpath

我有几行代码看起来像这样。

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看起来应该没有重复的项目元素(具有相同标题的项目,链接,描述,pubDate只会出现一次)

  <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
    }

1 个答案:

答案 0 :(得分:1)

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

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