我正在PHP中导入带有SimpleXMLElement
的RSS源。我的标题和描述有问题。出于某种原因,我从Feed获得的网站将标题和说明放在<![CDATA[...]]>
:
<item>
<title><![CDATA[...title...]]></title>
<link>...url...</link>
<description><![CDATA[...title...]]></description>
<pubDate>...date...</pubDate>
<guid>...link...</guid>
</item>
当我在SimpleXMLElement上执行var_dump()
时,我得到了(对于这部分):
[2]=>
object(SimpleXMLElement)#5 (5) {
["title"]=>
object(SimpleXMLElement)#18 (0) {
}
["link"]=>
string(95) "...link..."
["description"]=>
object(SimpleXMLElement)#19 (0) {
}
["pubDate"]=>
string(31) "...date..."
["guid"]=>
string(48) "...link..."
}
如何从 <![CDATA[...]]>
中获取值以阅读Feed中的标题和说明?
答案 0 :(得分:13)
SimpleXML绝对可以读取CDATA节点。您遇到的唯一问题是print_r
,var_dump
和类似函数无法准确表示SimpleXML对象,因为它们并未在PHP中完全实现。
如果你运行echo $myNode->description
,你会看到CDATA部分的内容就好了。原因是当您要求将SimpleXMLElement转换为字符串时,它会自动将所有文本和CDATA内容组合在一起 - 但在您这样做之前,它会记住这种区别。
作为一般情况,要在SimpleXML中提取任何元素或属性的字符串内容,请使用(string)$myNode
强制转换为字符串。这也可以防止其他问题,例如函数抱怨在期望字符串时获取对象,或者在保存到会话时无法序列化。