3

我正在尝试在 C# 中使用 XPath 来获取YouTube 最流行的 Atom 提要中 <link> 节点的 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 添加命名空间,但这也无济于事。

仓促回复将不胜感激!谢谢!

4

2 回答 2

4

我确信正确添加命名空间有所帮助,因为我确信这就是问题所在。不过,我个人会改用 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
    }
}
于 2012-04-15T21:20:37.987 回答
3

乔恩的回答绝对是今天(或任何时候)要走的路,但如果您对自己做错的事情感兴趣,那么这里有一个例子:

您的元素确实存在命名空间,它是默认命名空间。不幸的是,这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。

于 2012-04-15T21:38:10.880 回答