如何使用RSS feed从CDATA访问<content:encoded>?

时间:2015-07-17 09:13:43

标签: php rss simplexml cdata simplexml-load-string

问题

如果您尝试访问RSS Feed中的<content:encoded>,结果将为空。

XML

<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <item>
        <pubDate>Tue, 16 Jun 2015 14:58:15 +0200</pubDate>
        <title>title</title>
        <link>/your/path/</link>
        <description>description</description>
        <content:encoded>
        <![CDATA[
        <p>content</p>
        ]]>
        </content:encoded>
        </item>
    </channel>
</rss>

PHP

$data = simplexml_load_string($xml);

foreach ($data->channel->item as $item){
    $title = $item->title;
    var_dump($title); //title
    $content = $item->content;
    var_dump($content); //null
}

问题

如何访问内容并保存<p>content</p>

1 个答案:

答案 0 :(得分:3)

元素的名称不是content,而是encoded; content:是“名称空间前缀”,在文档顶部绑定到名称空间标识符"http://purl.org/rss/1.0/modules/content/"

因此,您需要使用the ->children() method来选择正确的命名空间:

echo $item->children('http://purl.org/rss/1.0/modules/content/')->encoded;

(显然,您可能会将该命名空间标识符放入某个变量或常量中,以避免每次需要时将其粘贴。)

请注意,我在这里使用了echo,而不是var_dump; var_dump不能很好地处理SimpleXML(反之亦然?),除此之外还会让它看起来像缺少CDATA内容。另一方面,echo隐式地转换为字符串以获取内容,这很好。在实际代码中,您可能希望明确地获取该字符串内容,如下所示:

$encoded_content = (string) $item->children('http://purl.org/rss/1.0/modules/content/')->encoded;