【问题标题】:Trouble reading iTunes XML feed无法读取 iTunes XML 提要
【发布时间】:2014-09-27 17:17:41
【问题描述】:

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

我想访问这样的字段:

<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 为空。为什么?我做错了什么?

【问题讨论】:

  • itemforeach 循环中得到了什么?
  • 他可以得到任何东西,因为items 为空..
  • @pwas:它不为空,它是一个包含 0 个元素的集合。
  • 嗯,OP 声称 items 为空。所以我认为他得到了NullReferenceException 什么的。
  • @pwas:刚刚测试过,它不是空的:)。

标签: c# xml rss itunes


【解决方案1】:

您需要创建一个命名空间管理器来将 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);
    }
}

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

docs as well:

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

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

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

最后,不知道你为什么说 items 是空的。它不可能是。运行原始代码时,您应该得到以下信息:

【讨论】:

  • 对不起,我的错误。它不是空的,而是 0 个项目。我将如何获得物品
  • @Parminder:没问题。我还是更新了答案。
  • 对于价格,它会引发错误命名空间前缀“im”未定义。
  • @Parminder:检查我的整个答案。我还注册了im 命名空间。
  • 奇怪的是,它重复了同一个条目 10 次。可能是什么问题?
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 2012-01-22
  • 2012-07-21
  • 2010-11-21
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多