2011-04-04 87 views
0

我有一個我正在編寫的應用程序,它允許用戶搜索Twitter,主要是爲了好玩並學習XML和LINQ如何一起玩。我編寫了代碼來獲取原子提要(示例查詢:http://search.twitter.com/search.atom?q=twitter),並且我可以驗證它實際上是否接收XML。解析鳴叫時的NullRefereceException

剛開始解析文檔,我覺得它很簡單,只是解析每個推文的內容。一旦我證實了這一點,那麼我會轉向作者,然後日期等等,直到所有內容都被解析。

下面是我用得到的內容是什麼:

  var list = from tweet in doc.Element("feed").Descendants("entry") 
         select new Tweet("AUTHOR", tweet.Element("content").Value, new DateTime(), "TITLE"); 

正如你所看到的,文檔結構看起來是這樣的:

<feed><entry><content></content></entry>.....</feed> 

至少就因爲我們是關心。我在這行代碼中得到了一個N​​ullReferenceException,但是調試器顯示文檔不是null(它實際上已經加載了整個Feed)。上一行調用XDocument.Parse(),它不會引發異常。

有誰知道什麼可能會導致我的倒臺?

回答

7

feed元件包括這樣的:

xmlns="http://www.w3.org/2005/Atom" 

其改變爲元素的默認名稱空間。您應該使用這樣的:

XNamespace ns = "http://www.w3.org/2005/Atom"; 
var list = from tweet in doc.Element(ns + "feed") 
          .Descendants(ns + "entry") 
      select new Tweet("AUTHOR", 
          tweet.Element(ns + "content").Value, 
          new DateTime(), "TITLE"); 

(只是爲了解釋,你正在尋找一個命名空間少「飼料」的元素;不存在的,所以Element返回null如果你僅僅是固定的。 ,Descendants會返回一個空序列如果要固定這兩個,tweet.Element("content")會返回null,造成不同NullPointerException

+1

全能喬恩Skeet知道答案:);) – 2011-04-04 13:45:47

+0

非常感謝您的幫助。我嘗試了命名空間,但只做了feed元素,並且在它不起作用時非常困惑。這解決了我的問題。 – ZachS 2011-04-04 13:53:23

1

有幾種可能:。

  1. Element("feed")是空
  2. Descendants("entry")是空
  3. tweet.Element("content")是空

你需要逐步完成,以找出哪些是罪魁禍首。