我想使用PHP解析RSS提要。 Feed有一个名为<link>
的标记。但是当我使用getElementsByTagName('link')
时,它会返回标记的内容,然后当我进一步使用-> childNodes -> nodeValue;
时,我没有得到任何结果并且出现错误
尝试获取非对象的属性
这就是我正在使用的:
$xml="https://cointelegraph.com/rss"
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
//get elements from "<channel>"
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$channel_title = $channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
//Problem Causing line
$channel_link = $channel->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
//Problem Causing line
$channel_desc = $channel->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
rss有这些标签:
<channel>
<title>Cointelegraph.com News</title>
<atom:link href="https://cointelegraph.com/rss/" rel="self" type="application/rss+xml"/>
<link>https://cointelegraph.com</link>
......
......
</channel>
当我尝试获取link
时,我会获得atom:link
还请建议是否有一种快速简便的方法来解析PHP中的RSS。
答案 0 :(得分:1)
你可以获得下一个项目
$channel->getElementsByTagName('link')->item(1)->nodeValue;
你应该得到这个网址,如果那是你所追求的那个
https://cointelegraph.com
这可以是您追求的通用解决方案。
$xml = 'https://cointelegraph.com/rss';
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$links = $channel->getElementsByTagName('link');
$channelLink = '';
for($i=0; $i < $links->length; $i++ ) {
$link = $channel->getElementsByTagName('link')->item($i);
if($link->hasAttribute('rel')) {// This can be replaced with what @NigelRen suggested.
continue;
}
$channelLink = $channel->getElementsByTagName('link')->item($i)->nodeValue;
break;
}
echo $channelLink;
答案 1 :(得分:1)
基于其他答案的评论(应该是问题的一部分),您可以使用XPath ...
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$xp = new DOMXPath($xmlDoc);
//get elements from "<channel>"
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$channel_title = $channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
//Problem Causing line
$channel_link = $channel->getElementsByTagName('link')->item(1)->childNodes->item(0)->nodeValue;
//Problem Causing line
echo $channel_link.PHP_EOL;
// Use XPath to get first link (not in namespace)
$channel_link = $xp->query("./link", $channel)[0]->nodeValue;
echo $channel_link;
最后一部分使用XPath查找<link>
中的任何<channel>
元素,但不涉及名称空间。
您需要创建$xp
变量,该变量是顶部附近的一行。