这个XPath查询有什么问题?

时间:2010-02-16 01:09:36

标签: .net xml xpath rss

我正在尝试从rss Feed中选择节点。它适用于Twitter,但我不能在Youtube上这样做。

        string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads";
        string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss";

        //this populates the XmlNodeList object
        XmlTextReader readerTwitter = new XmlTextReader(twitter);
        XmlDocument docTwitter = new XmlDocument();
        docTwitter.Load(readerTwitter);
        XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item");

        //this doesn't populate the object
        XmlTextReader readerYoutube = new XmlTextReader(youtube);
        XmlDocument docYoutube = new XmlDocument();
        docYoutube.Load(readerYoutube);
        XmlNodeList nodesYoutube = docYoutube.SelectNodes("/feed/entry");

任何想法?

7 个答案:

答案 0 :(得分:3)

您尝试在空命名空间中选择节点“条目”,而您应该尝试在命名空间“http://www.w3.org/2005/Atom”中选择节点“条目”。

您可以使用XMLNamespaceManager指定默认命名空间:

XmlNamespaceManager nsmanager = new XmlNamespaceManager(docYoutube.NameTable);
nsmanager.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");

或者您可以使用"/*[local-name()='feed']/*[local-name()='entry']"

答案 1 :(得分:1)

指定命名空间。

答案 2 :(得分:1)

如果要显示XPath查询的结果,可以使用XpathVisualizer。 这是一个WinForms工具。加载要查询的XML文档,键入查询,查看结果。

alt text http://i45.tinypic.com/2jb409.jpg

免。开源。

答案 3 :(得分:0)

如果它没有生成错误,则必须是因为xml文档不包含<feed> - 元素,或<entry>元素与<feed> - 父元素。 / p>

答案 4 :(得分:0)

尝试使用//代替/来解决问题的基础。所以像//输入我的工作更好,因为它将探索寻找你的请求的深度。

但我的问题是XPath查询是否实际上正在检索任何内容。

答案 5 :(得分:0)

string youtube = "http://gdata.youtube.com/feeds/api/users/CTVOlympics/uploads";
string twitter = "http://twitter.com/statuses/user_timeline/ctvolympics.rss";

//this populates the XmlNodeList object
XmlDocument docTwitter;
using (var readerTwitter = XmlReader.Create(twitter))
{
    docTwitter = new XmlDocument();
    docTwitter.Load(readerTwitter);
}
XmlNodeList nodesTwitter = docTwitter.SelectNodes("/rss/channel/item");

//this doesn't populate the object
XmlDocument docYoutube;
using (var readerYoutube = XmlReader.Create(youtube))
{
    docYoutube = new XmlDocument();
    docYoutube.Load(readerYoutube);
}
XmlNamespaceManager ns = new XmlNamespaceManager(docYoutube.NameTable);
ns.AddNamespace("atom", "http://www.w3.org/2005/Atom");
XmlNodeList nodesYoutube = docYoutube.SelectNodes("/atom:feed/atom:entry", ns);

答案 6 :(得分:0)

尝试一下:"/*[local-name()='feed']/*[local-name()='entry']"