PHP-getElementsByTagName(';link';)即使存在于Rss提要中也会失败

PHP-getElementsByTagName(';link';)即使存在于Rss提要中也会失败,php,rss,Php,Rss,我想用PHP解析RSS提要。提要有一个名为的标记。但是当我使用getElementsByTagName('link')时,它返回标记的内容,然后当我进一步使用->childNodes->nodeValue时我没有得到任何结果和一个错误 正在尝试获取非对象的属性 这就是我正在使用的: $xml="https://cointelegraph.com/rss" $xmlDoc = new DOMDocument(); $xmlDoc->load($xml); //get elements f

我想用PHP解析RSS提要。提要有一个名为
的标记。但是当我使用
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;  
$xml=”https://cointelegraph.com/rss"
$xmlDoc=新的DOMDocument();
$xmlDoc->load($xml);
//从“”获取元素
$channel=$xmlDoc->getElementsByTagName('channel')->项(0);
$channel\u title=$channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
//引起问题的线路
$channel\u link=$channel->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
//引起问题的线路
$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>  

电报网新闻
https://cointelegraph.com
......
......
当我尝试获取
link
时,我得到的是
atom:link

还请建议是否有另一种在PHP中解析RSS的快捷方法。

您可以获得下一个项目

$channel->getElementsByTagName('link')->item(1)->nodeValue;
如果你要找的是这个url,你应该得到这个url

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;
$xml='1!'https://cointelegraph.com/rss';
$xmlDoc=新的DOMDocument();
$xmlDoc->load($xml);
$channel=$xmlDoc->getElementsByTagName('channel')->项(0);
$links=$channel->getElementsByTagName('link');
$channelLink='';
对于($i=0;$i<$links->length;$i++){
$link=$channel->getElementsByTagName('link')->item($i);
如果($link->hasAttribute('rel')){//,可以用@NigelRen建议的内容替换。
继续;
}
$channelLink=$channel->getElementsByTagName('link')->item($i)->nodeValue;
打破
}
echo$channelLink;

根据其他答案的注释(这应该是问题的一部分),您可以使用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;
$xmlDoc=newDOMDocument();
$xmlDoc->load($xml);
$xp=新的DOMXPath($xmlDoc);
//从“”获取元素
$channel=$xmlDoc->getElementsByTagName('channel')->项(0);
$channel\u title=$channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
//引起问题的线路
$channel\u link=$channel->getElementsByTagName('link')->item(1)->childNodes->item(0)->nodeValue;
//引起问题的线路
echo$channel\u link.PHP\u EOL;
//使用XPath获取第一个链接(不在命名空间中)
$channel\u link=$xp->query(“./link”,$channel)[0]->nodeValue;
echo$channel_link;
最后一部分使用XPath查找
中的任何
元素,但不涉及名称空间


您需要创建
$xp
变量,该变量是靠近顶部的一行。

由于有很多链接,您想保留哪个链接。例如,它们是否看起来像“频道标签内的链接”。项目标记也有链接标记,但访问这些标记没有问题,因为在同一父级中没有atom:link标记。只有通道标记同时具有atom:link和link,这会导致GetElementById返回atom:link而不是link。(我不知道为什么…)但我也希望它是通用的。并不是所有提要都有atom:link,链接到之前的链接。如果我尝试在其他地方使用它,会不会失败?在我的实验中,当我在没有atom:link标签的情况下使用item(0)和item(1)时,我得到了相同的结果(例如在谷歌新闻rss中)。。。我不知道为什么它是一样的。但这是一样的。那样的话,你的回答对我仍然有效。Thanks@KashyapKotak这增加了复杂性,最好是将其添加到问题中。通常,同一个rss源会有相同的结构,除非他们改变它。@KashyapKotak您可以循环使用
getElementsByTagName('link')
,如果它没有像'rel'这样的属性或任何属性,那么这就是您要寻找的链接,因为atom:link几乎没有属性。我希望这有帮助。你可以简单地检查每个元素
nodeName
,它将是
atom:link
link
@NigelRen我同意你的看法,这会更容易。真的很有帮助。。。谢谢:)