我有一个xml文件
<?xml version="1.0" encoding="utf-8"?>
<xml>
<events date="01-10-2009" color="0x99CC00" selected="true">
<event>
<title>You can use HTML and CSS</title>
<description><![CDATA[This is the description ]]></description>
</event>
</events>
</xml>
我使用xpath和xquery来解析xml。
$xml_str = file_get_contents('xmlfile');
$xml = simplexml_load_string($xml_str);
if(!empty($xml))
{
$nodes = $xml->xpath('//xml/events');
}
我正确地获得了标题,但是我没有得到描述。我如何能够获得数据 cdata
答案 0 :(得分:9)
使用print_r
或其他“普通”PHP调试功能之一,您可能会误以为缺少CDATA。这些不能看到SimpleXML对象的全部内容,因为它不是“真正的”PHP对象。
如果你运行echo $nodes[0]->Description
,你会发现你的CDATA很好。发生了什么事情,PHP知道echo
需要一个字符串,所以要求SimpleXML为一个; SimpleXML使用 all 响应字符串内容,包括CDATA。
要可靠地获取完整的字符串内容,只需告诉PHP您想要的是使用(string)
强制转换运算符的字符串,例如: $description = (string)$nodes[0]->Description
。
要调试SimpleXML对象而不是被这样的怪癖所欺骗,请使用专用的调试功能,例如:https://github.com/IMSoP/simplexml_debug
答案 1 :(得分:8)
SimpleXML对CDATA有点问题,所以请使用:
$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA);
if(!empty($xml))
{
$nodes = $xml->xpath('//xml/events');
}
print_r( $nodes );
这会给你:
Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[date] => 01-10-2009
[color] => 0x99CC00
[selected] => true
)
[event] => SimpleXMLElement Object
(
[title] => You can use HTML and CSS
[description] => This is the description
)
)
)
答案 2 :(得分:2)
这也可能是另一个可行的选择,它将删除该代码并使生活更轻松。
$xml = str_replace("<![CDATA[", "", $xml);
$xml = str_replace("]]>", "", $xml);