2010-09-06 55 views
8

我有一个XML文件获取CDATA内容在解析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

回答

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 
       ) 

     ) 

) 
+0

谢谢slomojo。它工作正常。 – Warrior 2010-09-06 10:35:26

+4

错! SimpleXML对CDATA没有任何问题,这是一个持续的神话,不应该延续。它只是'print_r',它看不到CDATA,因为SimpleXML实际上并没有将它的数据存储为一个“真正的”PHP对象,它只是在需要时进行咳嗽。 – IMSoP 2012-12-11 23:54:00

9

你可能是错导致认为通过使用print_r或其他“正常”PHP调试功能之一,CDATA缺失。这些不能看到SimpleXML对象的全部内容,因为它不是“真正的”PHP对象。

如果你运行echo $nodes[0]->Description,你会发现你的CDATA出来没问题。发生什么事是PHP知道echo需要一个字符串,所以要求SimpleXML为一个; SimpleXML以全部响应字符串内容,包括CDATA。

为了可靠地获得全部字符串内容,只需使用(string)演员操作符告诉PHP你想要的是一个字符串。 $description = (string)$nodes[0]->Description

要调试的SimpleXML对象,而不是通过这样的怪癖被愚弄,使用专用的调试功能,如下列操作之一:https://github.com/IMSoP/simplexml_debug

2

这也可能是另一种可行的选择,这将删除代码,使生活更容易一点。

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