问题
如果您尝试访问RSS提要中的<content:encoded>
,结果将为null。
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>
?
元素的名称不是content
,而是encoded
;content:
是"名称空间前缀",在文档顶部绑定到名称空间标识符"http://purl.org/rss/1.0/modules/content/"
。
因此,您需要使用->children()
方法来选择正确的命名空间:
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;