【问题标题】:SimpleXML feed showing blank arrays - how do I get the content out?显示空白数组的 SimpleXML 提要 - 如何获取内容?
【发布时间】:2012-09-13 22:52:34
【问题描述】:

我正在尝试使用 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;`


    } 
}

谢谢

【问题讨论】:

  • 而不是print_r,尝试使用my simplexml_dump() function 检查您的SimpleXML 对象。它可能无济于事,但它可能会告诉你哪里出错了。

标签: php wordpress rss simplexml feed


【解决方案1】:

你会用吗

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

希望这会有所帮助

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      原来数据在那里,但它是 CDATA,所以它没有正确显示。

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

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

      所以一开始我是这样用的:

      $feed = simplexml_load_file($rss_url);
      

      我得到了这样的空描述:

      [description] => SimpleXMLElement Object
          (
          )
      

      但后来我在 PHP.net 网站的 cmets 中找到了这个解决方案,说我需要使用 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!
      

      【讨论】:

        猜你喜欢
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        相关资源
        最近更新 更多