我正在尝试使用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;`
}
}
感谢
答案 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!