PHP - getElementsByTagName(' link')即使在Rss Feed中存在也会失败

时间:2018-03-03 06:59:05

标签: php rss

我想使用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。

2 个答案:

答案 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变量,该变量是顶部附近的一行。