PHP读取RSS源获取节点中的第三链接

问题描述:

我正在读RSS提要的错误,每个节点有3个环节:PHP读取RSS源获取节点中的第三链接

<link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2202110476673931679/6339893542751280730/comments/default/1280042367141045524'/> 
 

 
<link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2202110476673931679/6339893542751280730/comments/default/1280042367141045524'/> 
 

 
<link rel='alternate' type='text/html' href='http://misterika.blogspot.com/2016/04/blog-post_11.html?showComment=1460801110852#c1280042367141045524' title=''/>

我读了“href”属性这样的:

'link' => $node->getElementsByTagName('link')->item(0)->getAttribute('href')

对于第一个链接使用项目(0)时没有问题,当我使用项目(1)作为第二个链接时没有问题,但当我使用项目(2)作为第三个链接时,出现此错误:

致命错误:调用一个成员函数的getAttribute()非对象

任何想法,我怎么能解决这个问题吗?

这里是我的全码:

<?php 
$rss = new DOMDocument(); 

$rss->load('http://misterika.blogspot.com/feeds/comments/default'); 

$feed = array(); 
foreach ($rss->getElementsByTagName('entry') as $node) { 
    $item = array ( 
     'title' => $node->getElementsByTagName('name')->item(0)->nodeValue, 
     'desc' => $node->getElementsByTagName('content')->item(0)->nodeValue, 
     'link' => $node->getElementsByTagName('link')->item(2)->getAttribute('href'), 
     'date' => $node->getElementsByTagName('published')->item(0)->nodeValue, 
     ); 
    array_push($feed, $item); 
} 
$limit = 5; 
for($x=0;$x<$limit;$x++) { 
    $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']); 
    $link = $feed[$x]['link']; 
    $description = $feed[$x]['desc']; 
    $date = date('l F d, Y', strtotime($feed[$x]['date'])); 
    echo '<p><strong><a href="'.$link.'" title="'.$title.'">'.$title.'</a></strong><br />'; 
    echo '<small><em>Posted on '.$date.'</em></small></p>'; 
    echo '<p>'.$link.'</p>'; 
    echo '<p>'.$description.'</p>'; 
} 

>

+1

这意味着节点下的DOM中没有第三个链接。 – PeeHaa

,当我用下面的示例代码段测试,它的工作?

<?php 

$xml = "<root><entry><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2202110476673931679/6339893542751280730/comments/default/1280042367141045524'/> 

<link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2202110476673931679/6339893542751280730/comments/default/1280042367141045524'/> 

<link rel='alternate' type='text/html' href='http://misterika.blogspot.com/2016/04/blog-post_11.html?showComment=1460801110852#c1280042367141045524' title=''/></entry> 

<entry><link rel='edit' type='application/atom+xml' href='http://google.com/'/> 

<link rel='self' type='application/atom+xml' href='http://jenson.in/'/></entry></root>"; 

$node = new DOMDocument; 
$node->loadXML($xml); 

foreach($node->getElementsByTagName("entry") as $entry) 
{ 
    $link = $entry->getElementsByTagName("link"); 

    echo $node->getElementsByTagName('link')->item(0)->getAttribute('href')."<br/>"; 
    echo $node->getElementsByTagName('link')->item(1)->getAttribute('href')."<br/>"; 
    //Below code checks if third link exists or not. 
    echo ($link->length > 2)?$node->getElementsByTagName('link')->item(2)->getAttribute('href'):"No alternate link!"."<br/>"; 
} 
?> 

See Demo

UPDATE:

在您的饲料XML,有一个可用后http://misterika.blogspot.com/2016/03/blog-post_20.html?showComment=1462627509971#c2966841279736454385只有2个链接没有第三链接在entry节点。这就是为什么你会得到错误。

+0

这段代码有效,但仍然无法帮助我处理这个奇怪的提要。我将我的所有代码都放在了原始文章中。 –

+0

@ Georgi.Bonchev没有第三个链接可用于一个或多个'entry'节点,这就是为什么你会遇到错误。检查更新的答案。 –

+0

恩,谢谢,但这不是答案。每个标签有3个链接元素 - 链接rel ='编辑',链接rel ='self',链接rel ='备用'。我需要访问第三个链接。 –

编辑 看网址后,你提供我使用DOMXPath作出调整的代码,就像这样:

$doc = new DOMDocument(); 
$doc->preserveWhiteSpace = false; 
$rss = file_get_contents('http://misterika.blogspot.com/feeds/comments/default'); 

$doc->loadXML($rss); 
$xpath = new DOMXpath($doc); 
$xpath->registerNameSpace('atom', 'http://www.w3.org/2005/Atom'); 

$links = $xpath->query('/atom:feed/atom:entry/atom:link[@href]'); 

foreach ($links as $link) { 
    $node = $link->nodeName; 
    $href = $link->getAttribute('href'); 

    echo "{$node} - {$href}\n"; 
} 

这里的关键是,以注册的默认命名空间的代码工作。

+0

我正在阅读的饲料在这里:http://misterika.blogspot.com/feeds/comments/default我想让它运行这个代码,但仍然有麻烦。 –

+0

@ Georgi.Bonchev URL使得它更加清晰,我对代码进行了调整。 –

+0

看起来它可能会解决问题。非常有用的代码。 –