1

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

在源代码中,[description] 的数组显示为空白,尽管我已经设法使用另一个循环将其拉出,但是,我终生无法弄清楚如何拉入下一个数组,随后每个帖子的图像!

帮助?

你可以在这里查看我的进度:http: //dev.thebarnagency.co.uk/tfolphp.php

这是原始提要: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;`


    } 
}

谢谢

4

3 回答 3

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

希望这会有所帮助

于 2012-09-14T02:25:57.483 回答
0

我不完全清楚你的问题是什么 - 你提供的代码似乎工作正常。

您提到“每个帖子的图像”,但我看不到 XML 中专门标记的任何图像。我可以看到的是,在contentXML 的节点中的 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; }(遍历所有带有标签 name 的子元素description
  • echo $item->description[0];(具体访问第一description个子节点)
  • echo $item->description;(隐式访问第一个/唯一的description子节点;这就是为什么你可以编写$feed->channel->item并且如果有第二个channel元素它仍然可以工作,它会忽略它)
于 2012-09-15T13:02:49.460 回答
0

我遇到了一个问题,simplexml_load_file 也将一些数组部分返回为空白,即使它们在您直接查看源 URL 时包含数据。

原来数据在那里,但它是 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!
于 2020-04-17T04:37:32.947 回答