我正在编写一个允许用户搜索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(),它不会抛出异常。
有谁知道可能导致我垮台的原因?
答案 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)
有几种可能性:
Element("feed")
为空Descendants("entry")
为空tweet.Element("content")
为空你需要逐步找出哪个是罪魁祸首。