获取CDATA内容在解析XML文件获取CDATA内容在解析XML文件(Getting cdata c

2019-05-12 03:33发布

我有一个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');
}

我正在正确地获得冠军,但IAM没有得到description.How我可以得到CDATA内部的数据

Answer 1:

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 
                )

        )

)


Answer 2:

你可能会被误导,以为在CDATA通过使用丢失print_r或其他“正常”的PHP调试功能之一。 这些看不见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



Answer 3:

这也可能是另一种可行的选择,这将删除代码,使生活变得更轻松。

$xml = str_replace("<![CDATA[", "", $xml);
$xml = str_replace("]]>", "", $xml);


文章来源: Getting cdata content while parsing xml file