无法阅读iTunes XML Feed

时间:2014-08-05 06:04:58

标签: c# xml rss itunes

我正在尝试从http://itunes.apple.com/us/rss/topsongs/limit=10/genre=2/xml读取XML Feed。

我想访问这样的字段:

<im:price amount="1.29000" currency="USD">$1.29</im:price>
<im:releaseDate label="December 31, 1960">1960-12-31T16:00:00-07:00</im:releaseDate>

这是我到目前为止所做的:

var xml = "http://itunes.apple.com/us/rss/topsongs/limit=10/genre=2/xml";
XmlDocument doc = new XmlDocument();
doc.Load(xml);
XmlNodeList items = doc.SelectNodes("//entry");
foreach (var item in items) {
    // Do something with item.
}
但是,没有运气。 items为空。为什么?我做错了什么?

1 个答案:

答案 0 :(得分:4)

您需要创建一个名称空间管理器来将RSS以及iTunes自定义标签名称空间URI映射到短前缀(以下示例中的itunes和im):

var xml = "http://itunes.apple.com/us/rss/topsongs/limit=10/genre=2/xml";

XmlDocument doc = new XmlDocument();
doc.Load(xml);
var namespaceManager = new XmlNamespaceManager(doc.NameTable);
namespaceManager.AddNamespace("itunes", "http://www.w3.org/2005/Atom");
namespaceManager.AddNamespace("im", "http://itunes.apple.com/rss");

XmlNodeList items = doc.SelectNodes("//itunes:entry", namespaceManager);
foreach (XmlNode item in items)
{
    var price = item.SelectSingleNode("im:price", namespaceManager);
    var releaseDate = item.SelectSingleNode("im:releaseDate", namespaceManager);

    if (price != null)
    {
        Console.WriteLine(price.Attributes["amount"].InnerText);
    }

    if (releaseDate != null)
    {
        Console.WriteLine(releaseDate.Attributes["label"].InnerText);
    }
}

对于该特定Feed,您应该获得10个条目。

它位于docs as well

  

如果XPath表达式不包含前缀,则假定为   名称空间URI是空名称空间。如果您的XML包含   默认命名空间,您仍然必须使用XmlNamespaceManager并添加   它的前缀和名称空间URI;否则,你不会得到任何   选择的节点。有关更多信息,请参阅使用XPath选择节点   导航

或者,您可以使用与命名空间无关的XPath(来自here):

XmlNodeList items = doc.SelectNodes("//*[local-name() = 'entry']");

最后,不确定为什么你说的项目为空。它不可能是。运行原始代码时,您应该得到:

enter image description here