我尝试使用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);
}
答案 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文件,而且还没有大约十年。