LINQ查询问题

时间:2011-05-19 12:42:55

标签: c# linq

无法在Feed中获得任何结果。 feedXML具有正确的数据。

XDocument feedXML = XDocument.Load(@"http://search.twitter.com/search.atom?q=twitter");

var feeds = from entry in feedXML.Descendants("entry")
            select new
            {
                PublicationDate = entry.Element("published").Value,
                Title = entry.Element("title").Value
            };

我错过了什么?

4 个答案:

答案 0 :(得分:3)

您需要指定命名空间:

// This is the default namespace within the feed, as specified
// xmlns="..." 
XNamespace ns = "http://www.w3.org/2005/Atom";

var feeds = from entry in feedXML.Descendants(ns + "entry")
            ...

所有我使用的其他XML API相比,LINQ to XML中的命名空间处理非常简单:)

答案 1 :(得分:2)

您需要在Descendents和Element方法上指定命名空间。

XDocument feedXML = XDocument.Load(@"http://search.twitter.com/search.atom?q=twitter");

XNamespace ns = "http://www.w3.org/2005/Atom";
var feeds = from entry in feedXML.Descendants(ns + "entry")
            select new
            {
            PublicationDate = entry.Element(ns + "published").Value,
            Title = entry.Element(ns + "title").Value
            };

答案 2 :(得分:0)

如果查看HTTP请求返回的XML,您将看到它定义了一个XML命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ...>
  <id>tag:search.twitter.com,2005:search/twitter</id>
  ...
</feed>

XML就像C#一样,如果你使用一个带有错误名称空间的元素名称,它就不被认为是同一个元素!您需要在查询中添加所需的namepsace:

private static string AtomNamespace = "http://www.w3.org/2005/Atom";

public static XName Entry = XName.Get("entry", AtomNamespace);

public static XName Published = XName.Get("published", AtomNamespace);

public static XName Title = XName.Get("title", AtomNamespace);

var items = doc.Descendants(AtomConst.Entry)
                .Select(entryElement => new FeedItemViewModel()
                new {
                  Title = entryElement.Descendants(AtomConst.Title).Single().Value,
                  ...
                });

答案 3 :(得分:0)

问题出在feedXML.Descendants("entry")。这返回0结果 根据{{​​3}},您需要输入完全限定的XName