2012-04-15 74 views
3

我想在C#中使用XPath获取<链接>节点的href值YouTube most popular Atom feedXPath不返回结果 - YouTube feed

从我在网上阅读文档,这个过程会相对简单,沿着线的东西:

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

我确定正确添加命名空间会帮助,因为我确定这是问题所在。就我个人而言,我会使用LINQ到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 
    } 
} 
+0

非凡!谢谢,我会放弃它,并返回我的结果。 – 2012-04-15 21:25:29

+0

+1我今年的目标是实际使用System.Xml.Linq,感谢这个例子。 – dash 2012-04-15 21:41:12

+0

@dash:我发现现在使用任何其他XML API都很痛苦:) – 2012-04-15 21:42:11

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中。

+0

谢谢,这非常有帮助。我确实沿着这些路线尝试了一些东西,但我一定在某个地方搞砸了。 – 2012-04-15 21:47:08