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);

linkライブ ドキュメントでテストすると、25 個の要素を含む XmlNodeList が生成されます。

于 2012-04-15T21:38:10.880 に答える