为什么它不显示所有信息为xml?

时间:2016-06-18 12:35:36

标签: php xml

PHP

$ch = curl_init() ;

$url = "http://www.espnfc.com/rss" ; 

curl_setopt($ch, CURLOPT_URL , $url) ;
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$xml = curl_exec($ch); 

curl_close($ch); 

$xmlTree = new simpleXMLElement($xml) ; 

echo "<pre>" ;
print_r($xmlTree->channel->item[0]) ;
echo "</pre>" ; 

如果我在Feed网站上有标题和发布日期可用,它不会在输出中显示,它是空白的SimpleXMLElement对象。为什么这种形成与饲料不匹配。

2 个答案:

答案 0 :(得分:0)

来自espnfc.com的RSS在其代码中使用了大量<![CDATA[。这就是给出输出问题的原因。我们需要从结果中删除所有CDATA,然后再将其解析为xml对象。我为你写了一些代码来实现这个技巧。

$url = "http://www.espnfc.com/rss" ; 
$content = file_get_contents($url); // I replaced all your curl code with this
$rm_1 = str_replace("<![CDATA[","",$content);
$rm_2 = str_replace("]]>","",$rm_1);
$xmlTree = new simpleXMLElement($rm_2);
$feed = $xmlTree->channel->item[0];

echo "<pre>";
print_r($feed);
echo "</pre>";

如果你想用Curl:

做这个代码
$ch = curl_init() ;

$url = "http://www.espnfc.com/rss" ; 

curl_setopt($ch, CURLOPT_URL , $url) ;
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$xml = curl_exec($ch); 

curl_close($ch); 

$rm_1 = str_replace("<![CDATA[","",$xml);
$rm_2 = str_replace("]]>","",$rm_1);

$xmlTree = new simpleXMLElement($rm_2) ; 

echo "<pre>" ;
print_r($xmlTree->channel->item[0]) ;
echo "</pre>" ;

修改1:为Curl添加了代码

答案 1 :(得分:0)

由于SimpleXML使用的神奇语法,print_r()var_dump()等函数不会始终输出所有可用数据。如果你访问它们,他们仍然会在那里。使用SimpleXMLElement::asXML()获取元素节点的序列化XML。

$rss = new SimpleXMLElement($xml);

foreach ($rss->channel->item as $item) {
  var_dump($item->asXml());
} 

这取决于您的PHP版本。较新版本可能会输出更多数据。

您可以添加一个避免它们的参数(它们会转换为普通文本节点)。

$rss = new SimpleXMLElement($xml, LIBXML_NOCDATA);

foreach ($rss->channel->item as $item) {
   print_r($item);
}