解析xml文件时获取cdata内容

War*_*ior 8 php xquery simplexml

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我使用xpath和xquery来解析xml.

$xml_str = file_get_contents('xmlfile');
$xml = simplexml_load_string($xml_str);
if(!empty($xml))
{
    $nodes = $xml->xpath('//xml/events');
}
Run Code Online (Sandbox Code Playgroud)

我正在得到正确的标题,但我没有得到描述.如何我可以获得cdata内的数据

IMS*_*SoP 9

通过使用print_r或其他"正常"PHP调试功能之一,您可能被误导认为CDATA丢失了.这些不能看到SimpleXML对象的全部内容,因为它不是"真正的"PHP对象.

如果你跑echo $nodes[0]->Description,你会发现你的CDATA很好.发生了什么事情,PHP知道echo需要一个字符串,所以要求SimpleXML为一个; SimpleXML响应所有字符串内容,包括CDATA.

要可靠地获取完整的字符串内容,只需告诉PHP您想要的是使用(string)强制转换运算符的字符串,例如$description = (string)$nodes[0]->Description.

要调试SimpleXML对象而不是被这样的怪癖所欺骗,请使用专用的调试功能,例如:https://github.com/IMSoP/simplexml_debug


oco*_*odo 8

SimpleXML对CDATA有点问题,所以使用:

$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA);
if(!empty($xml))
{
    $nodes = $xml->xpath('//xml/events');
}
print_r( $nodes );
Run Code Online (Sandbox Code Playgroud)

这会给你:

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 
                )

        )

)
Run Code Online (Sandbox Code Playgroud)

  • 错误!SimpleXML对CDATA没有任何问题,这是一个持久性的神话,不应该延续下去.只有`print_r`无法看到CDATA,因为SimpleXML实际上并不将其数据存储为"真正的"PHP对象,而是根据需要咳嗽. (5认同)