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 添加命名空间,但这也没有帮助。
匆忙回复将不胜感激!谢谢!
我相信正确添加命名空间会有所帮助,因为我确信这就是问题所在。就个人而言,我会使用 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。