【问题标题】:read cdata from a rss feed从 RSS 提要中读取 cdata
【发布时间】:2011-11-05 12:30:49
【问题描述】:

我正在使用简单的代码阅读 RSS 提要:

 <?php
$homepage = file_get_contents('http://www.forbes.com/news/index.xml');
$movies = new SimpleXMLElement($homepage);
echo '<pre>';
print_r($movies);
?>

和这样的输出: SimpleXMLElement 对象 ( [@attributes] => 数组 ( [版本] => 2.0 )

[channel] => SimpleXMLElement Object
    (
        [title] => SimpleXMLElement Object
            (
            )

        [link] => SimpleXMLElement Object
            (
            )

        [description] => SimpleXMLElement Object
            (
            )

        [language] => en-us
        [copyright] => Copyright 2009 Forbes.com LLC
        [item] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [title] => SimpleXMLElement Object
                            (
                            )

                        [link] => SimpleXMLElement Object
                            (
                            )

                        [author] => SimpleXMLElement Object
                            (
                            )

                        [pubDate] => Sat, 05 Nov 2011 07:17:21 GMT
                        [description] => SimpleXMLElement Object
                            (
                            )

                    )

还有更多…… 但是当我查看此页面的来源时,我有这样的信息:

 <rss version="2.0"><channel><title><![CDATA[Forbes.com: News]]></title><link><!   [CDATA[http://www.forbes.com]]></link><description><![CDATA[News and reports from Forbes.com]]></description><language>en-us</language><copyright>Copyright 2009 Forbes.com LLC</copyright><item><title><![CDATA[Benicio Del Toro Offered Villain Role In "Star Trek" Sequel - Is It Khan?]]></title><link><![CDATA[http://www.forbes.com/sites/markhughes/2011/11/05/benicio-del-toro-offered-villain-role-in-star-trek-sequel-is-it-khan/?feed=rss_home]]></link><author><![CDATA[Mark Hughes]]></author><pubDate>Sat, 05 Nov 2011 07:17:21 GMT</pubDate><description><![CDATA[Variety reports that actor Benicio del Toro is being offered the role of villain in the upcoming sequel to director J.J. Abram?s 2009 blockbuster franchise-reboot movie Star Trek. So far, Abrams and crew have kept a tight lid on details about the new Paramount film, and the identity of the main villain is a closely ...]]></description>

如何在 mydatabase 中读取和存储 CDATA 值。

【问题讨论】:

  • 看到这个link
  • 很难理解,也不清楚。

标签: php xml cdata


【解决方案1】:

上面的“修复”会起作用,但完全没有必要。

SimpleXML 对象包含很多“魔法”,并且不适合使用print_r 查看; CDATA 安全地存在于您的对象中,但除非您以正确的方式请求它,否则它不会显示出来。

如果您运行echo (string)$movies-&gt;channel-&gt;title;,您应该会得到“Forbes.com: News”,正如您所期望的那样。

注意(string),它告诉PHP 将“神奇”的SimpleXMLElement 显式转换为字符串。如果您不这样做,您实际上会得到另一个 SimpleXMLElement 对象 - 否则我的示例将不起作用,因为 $movies->channel 将是一个字符串。

在从 SimpleXML 访问元素或属性时始终使用 (string) 是一种很好的做法,因为如果某些函数需要一个字符串,而您给它们一个 SimpleXML 对象,并且序列化或会话存储肯定会失败。

【讨论】:

  • 如果您在 SimpleXMLElement 上运行 json_encode 或将元素转换为数组,那么这仍然会产生影响。
  • @hakre 确实如此,但大多数时候您可能不需要或不想这样做。 SimpleXML 旨在作为用于遍历 XML 结构的交互式 API;由于 PHP 和 JSON 的原生结构都不能轻易地表示 XML 的结构,所以最好的办法通常是用(string) 提取你想要的部分,或者用-&gt;asXML() 重新序列化一个部分。
  • 大多数时候你不需要这个。它只是为那些我有 XML 我想要 Array 类型的人。刚刚偶然发现你的一篇或多篇文章实际上让我想起了那个细节。顺便说一句,我在这里使用了一种稍微不同的方式来解释:stackoverflow.com/a/26316558/367456 - 我们应该为该主题创建一个参考问题,很好地解释这一点,并展示如何处理它的不同方法。你可以很好地解释它。
【解决方案2】:

告诉 SimpleXML 将 CDATA 转换为普通文本:

$homepage = 'http://www.forbes.com/news/index.xml';
$movies = simplexml_load_file($homepage, "SimpleXMLElement", LIBXML_NOCDATA);

这应该为你做,使用simplexml_load_file 而不是file_get_contents

相关答案:Removing cdata in simplehtmldom

【讨论】:

  • 坐下,其显示错误警告:simplexml_load_file() 期望参数 2 是从 SimpleXMLElement 派生的类名,在 D:\wamp\www\test_om\store-feed\cdata 中给出“16384”。 php 在第 3 行
  • forbes.com/news/index.xml'); $movies = simplexml_load_file($homepage, LIBXML_NOCDATA);回声'
    '; print_r($movies); ?>
  • @omnath:我的回答有误,缺少一个参数。我更新了它并修复了它。除此之外,它不再使用file_get_contents
  • 感谢先生,现在它可以工作了,但是如果我们使用 $homepage = file_get_contents('forbes.com/news/index.xml'); 我们可以使用 file_get_contents $xml = simplexml_load_string($homepage,'SimpleXMLElement', LIBXML_NOCDATA);
  • 当然,也可以。我认为最好将它放在一个函数调用中。但可以肯定的是,这也有效。通常有多种方法导致相同的:)
猜你喜欢
  • 2019-02-15
  • 2012-10-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多