【问题标题】:Getting cdata content while parsing xml file解析xml文件时获取cdata内容
【发布时间】:2010-09-06 09:05:55
【问题描述】:

我有一个 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

【问题讨论】:

    标签: php simplexml xquery


    【解决方案1】:

    使用print_r 或其他“正常”PHP 调试函数之一可能会误导您认为缺少CDATA。这些无法看到 SimpleXML 对象的全部内容,因为它不是“真正的”PHP 对象。

    如果您运行 echo $nodes[0]-&gt;Description,您会发现您的 CDATA 输出正常。发生的事情是 PHP 知道 echo 需要一个字符串,因此向 SimpleXML 询问一个字符串; SimpleXML 以 所有 字符串内容响应,包括 CDATA。

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

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

    【讨论】:

      【解决方案2】:

      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 
                      )
      
              )
      
      )
      

      【讨论】:

      • 错了! SimpleXML 与 CDATA 没有问题,这是一个不应该延续的长期神话。只有 print_r 看不到 CDATA,因为 SimpleXML 实际上并没有将其数据存储为“真正的”PHP 对象,它只是按需存储。
      【解决方案3】:

      这也可能是另一个可行的选择,它会删除该代码并使生活更轻松。

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

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 2021-01-26
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        相关资源
        最近更新 更多