XPath 不返回结果 - YouTube 提要

本文关键字:YouTube 提要 结果 返回 XPath | 更新日期: 2023-09-27 18:31:07

我正在尝试使用C#中的XPath在YouTube最受欢迎的Atom提要中获取

节点的href值。

从我在网上阅读的文档来看,这个过程相对简单,大致如下:

XmlDocument xml = new XmlDocument();
xml.Load("http://gdata.youtube.com/feeds/api/standardfeeds/most_popular");
XmlNodeList linkNodes;
linkNodes = xml.SelectNodes("/feed/entry/link[@rel='alternate']");

但这行不通,我没有得到任何结果。我尝试使用 XmlNamespaceManager 添加命名空间,但这也没有帮助。

匆忙回复将不胜感激!谢谢!

XPath 不返回结果 - YouTube 提要

我相信正确添加命名空间有所帮助,因为我确信这就是问题所在。就个人而言,我会使用 LINQ to XML 代替。示例代码:

using System;
using System.Linq;
using System.Xml.Linq;
public class Test
{
    static void Main()
    {
        string url =
             "http://gdata.youtube.com/feeds/api/standardfeeds/most_popular";
        var doc = XDocument.Load(url);
        XNamespace ns = "http://www.w3.org/2005/Atom";
        var links = doc.Root
                       .Elements(ns + "entry")
                       .Elements(ns + "link")
                       .Where(x => (string) x.Attribute("rel") == "alternate");
        Console.WriteLine(links.Count()); // 25
    }
}

Jon 的答案绝对是今天(或任何时候 ;-)要走的路,但如果你对自己做错了什么感兴趣,那么这里有一个例子:

元素确实存在命名空间,它是默认命名空间。不幸的是,XmlDocument类在向您展示这一点时并不那么优雅;相反,您通常会"伪造"映射到文档中根命名空间的命名空间前缀;在这种情况下xmlns=http://www.w3.org/2005/Atom

    XmlDocument xdoc = new XmlDocument();
    xdoc.Load("http://gdata.youtube.com/feeds/api/standardfeeds/most_popular");
    XmlNamespaceManager manager = new XmlNamespaceManager(xdoc.NameTable);
    manager.AddNamespace("base", "http://www.w3.org/2005/Atom");
    var nodes = xdoc.SelectNodes("/base:feed/base:entry/base:link[@rel='alternate']", manager);

使用实时文档进行测试会生成包含 25 个link元素的 XmlNodeList。