2011-07-20 138 views
1

我有幾行代碼,如下所示。刪除XDocument中的重複條目

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

這取決於你是什麼「不同」的意思,需要看樣品XML措施,假設它的意思是「從任何其他項的至少一個屬性值不同的」 – BrokenGlass

+0

我只是希望所有的重複刪除。 – theDawckta

+0

沒有你發佈你的XML,沒有人可以給你一個具體的答案 - 我們怎麼知道你的「項目」有什麼屬性? – BrokenGlass

回答

1

看看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))); 
+0

我想刪除重複項。對不起,但我不明白YourXElementComparer()是什麼。 – theDawckta

+0

@theDawckta,'YourXElementComparer'it是您自己實現的'IEqualityComparer''或者從'EqualityComparer '類派生的類。 –

+0

我在上面添加了我的xml結構,無論如何,你可以進一步幫助我嗎? – theDawckta