如何获取RSS提要的特定于iTunes的子节点?

时间:2016-01-01 04:54:13

标签: php rss itunes

我尝试使用PHP处理an RSS feed,并且我需要处理一些标记,例如'itunes:image'。我使用的代码如下,由于某些原因,这些元素没有返回任何值。输出长度为0。

如何阅读这些标签并获取其属性?

$f = $_REQUEST['feed'];
$feed = new DOMDocument();
$feed->load($f);
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

foreach($items as $key => $item) 
{
    $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
    $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
    $description = $item->getElementsByTagName('description')->item(0)->textContent; // textContent

    $arrt = $item->getElementsByTagName('itunes:image');
    print_r($arrt);
}

1 个答案:

答案 0 :(得分:3)

getElementsByTagName由DOM指定,PHP就是这样。它不考虑名称空间。相反,请使用getElementsByTagNameNS,这需要完整的命名空间URI(而不是前缀)。这appears to be http://www.itunes.com/dtds/podcast-1.0.dtd *。所以:

    $img = $item->getElementsByTagNameNS('http://www.itunes.com/dtds/podcast-1.0.dtd', 'image');
    // Set preemptive fallback, then set value if check passes
    urlImage = '';
    if ($img) {
      $urlImage = $img->getAttribute('href');
    }

或者将命名空间放在常量中。

您可以轻松删除前缀,并使用image获取任何名称空间的所有getElementsByTagName个标记。

确保检查给定项目是否具有itunes:image元素(现在给出示例);在示例播客中,有些人没有,我怀疑这也给你带来了麻烦。 (如果没有href属性,getAttribute将返回null或每个DOM规范的空字符串,而不会出错。)

* 如果你想知道,那个地方没有托管实际的DTD文件,而且还没有大约十年。