解析推文时出现NullRefereceException

时间:2011-04-04 13:40:59

标签: c# .net linq twitter linq-to-xml

我正在编写一个允许用户搜索Twitter的应用程序,主要是为了获得乐趣并学习XML和LINQ如何一起玩。我编写了用于获取原子提要的代码(示例查询:http://search.twitter.com/search.atom?q=twitter),我可以验证它实际上是在接收XML。

为了开始解析文档,我认为只需解析每条推文的内容就足够了。一旦我确认它有效,那么我会转到作者,然后是日期,依此类推,直到解析完所有内容。

以下是我用来获取内容的内容:

            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>

至少就我们而言。我在这行代码上得到一个NullReferenceException,但调试器显示该文档不为null(事实上它确实在其中加载了整个feed)。上一行调用XDocument.Parse(),它不会抛出异常。

有谁知道可能导致我垮台的原因?

2 个答案:

答案 0 :(得分: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");

(只是为了解释一下,你正在寻找一个没有命名空间的“feed”元素;这个元素不存在,所以Element返回null。如果你修复了那个,Descendants会返回一个空序列。如果你修复了这两个,tweet.Element("content")将返回null,导致不同 NullPointerException。)

答案 1 :(得分:1)

有几种可能性:

  1. Element("feed")为空
  2. Descendants("entry")为空
  3. tweet.Element("content")为空
  4. 你需要逐步找出哪个是罪魁祸首。