显示空白数组的SimpleXML提要 - 如何获取内容?

时间:2012-09-13 22:52:35

标签: php wordpress rss simplexml feed

我正在尝试使用simpleXML提要从rss提要中获取图像,并通过数组解析数据并返回到foreach循环...

在源代码中,[description]的数组显示为空白虽然我已经设法使用另一个循环将其拉出来但是,我不能在我的生活中找出如何拉入下一个数组,以及随后每个帖子的图像!

帮助?

您可以在此处查看我的进度:http://dev.thebarnagency.co.uk/tfolphp.php

这是原始Feed:feed://feeds.feedburner.com/TheFutureOfLuxury?format = xml

$xml_feed_url = 'http://feeds.feedburner.com/TheFutureOfLuxury?format=xml';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xml_feed_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($ch);
curl_close($ch);

function produce_XML_object_tree($raw_XML) {
libxml_use_internal_errors(true);
try {
    $xmlTree = new SimpleXMLElement($raw_XML);
} catch (Exception $e) {
    // Something went wrong.
    $error_message = 'SimpleXMLElement threw an exception.';
    foreach(libxml_get_errors() as $error_line) {
        $error_message .= "\t" . $error_line->message;
    }
    trigger_error($error_message);
    return false;
}
return $xmlTree;
}

$feed = produce_XML_object_tree($xml);

print_r($feed);

foreach ($feed->channel->item as $item) {
// $desc = $item->description;

echo '<a href="'.$item->link.'">link</a><br>';

    foreach ($item->description as $desc) {
        echo $desc;`


    } 
}

感谢

3 个答案:

答案 0 :(得分:0)

你能用吗

wp_remote_get( $url, $args );

我从这里得到http://dynamicweblab.com/2012/09/10-useful-wordpress-functions-to-reduce-your-development-time

还可以获得有关此功能的更多详细信息http://codex.wordpress.org/Function_API/wp_remote_get

希望这会有所帮助

答案 1 :(得分:0)

我不完全清楚你的问题在这里 - 你提供的代码似乎工作正常。

您提到“每个帖子的图片”,但我看不到XML中专门标记的图片。我可以看到,在XML的content节点中的HTML内部,通常有一个<img>标记。就XML文档而言,这整个HTML块只是一个用特殊标记<![CDATA[]]>分隔的字符串。如果将此字符串转换为PHP变量(使用(string)$item->content,则可以找到一种从其中提取<img>标记的方法 - 但请注意,HTML不太可能是有效的XML。

另外要提到的是,SimpleXML不是,因为你反复提到它,一个数组 - 它是一个对象,而且是一个特别神奇的对象。您对SimpleXML对象所做的一切 - foreach ( $nodeList as $node )isset($node)count($nodeList)$node->childNode$node['attribute']等 - 实际上是一个函数调用,通常返回另一个SimpleXML宾语。它的设计是为了方便,因此在许多情况下,编写看似自然的东西比检查对象更有帮助。

例如,由于每个item只有一个description,因此您不需要内部foreach循环 - 以下内容都具有相同的效果:

  • foreach ($item->description as $desc) { echo $desc; }(遍历标记名为description的所有子元素)
  • echo $item->description[0];(具体访问第一个description子节点)
  • echo $item->description;(隐式访问第一个/ description子节点;这就是您可以编写$feed->channel->item的原因,如果有第二个channel元素,它仍然可以工作,它会忽略它)

答案 2 :(得分:0)

我遇到一个问题,即使您直接查看源url时,simplexml_load_file也将一些数组节也返回空白,

原来的数据在那里,但是是CDATA,所以不能正确显示。

这可能是op遇到的同一问题吗?

无论如何,我的解决方案是这样:

所以最初我是用这个的:

$feed = simplexml_load_file($rss_url);

这样我得到了空的描述:

[description] => SimpleXMLElement Object
    (
    )

但是后来我在PHP.net网站的注释中找到了这个解决方案,说我需要使用LIBXML_NOCDATA: https://www.php.net/manual/en/function.simplexml-load-file.php

$feed = simplexml_load_file($rss_url, "SimpleXMLElement", LIBXML_NOCDATA);

进行此更改后,我得到了这样的描述:

[description] => My description text!