2010-09-06 16 views
8

Tengo un archivo XMLconseguir el contenido CDATA al analizar el archivo 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> 

Solía ​​XPath y XQuery y para analizar el código XML.

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

que estoy recibiendo el título correctamente, pero iam no conseguir description.How puedo conseguir los datos dentro de la CDATA

Respuesta

8

SimpleXML tiene un poco de un problema con CDATA, por lo utilizo:

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

Esto le dará:

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

Gracias slomojo. Está funcionando bien. – Warrior

+4

¡Incorrecto! SimpleXML no tiene ningún problema con CDATA, y este es un mito persistente que no debe perpetuarse. Solo 'print_r' no puede ver el CDATA, porque SimpleXML en realidad no almacena sus datos como un objeto PHP" real ", simplemente lo copia a pedido. – IMSoP

9

usted está siendo probablemente mal llevado a pensar que falta el CDATA usando print_r o una de las otras funciones de depuración de PHP "normales". Estos no pueden ver el contenido completo de un objeto SimpleXML, ya que no es un objeto PHP "real".

Si ejecuta echo $nodes[0]->Description, verá que su CDATA está bien. Lo que sucede es que PHP sabe que echo espera una cadena, por lo que pide SimpleXML para uno; SimpleXML responde con todo el contenido de cadena, incluido CDATA.

Para obtener el contenido completo de cadenas de manera confiable, simplemente dígale a PHP que lo que quiere es una cadena usando el operador de conversión (string), p. $description = (string)$nodes[0]->Description.

para depurar objetos SimpleXML y no se deje engañar por las peculiaridades de este tipo, utilizar una función de depuración dedicada, como uno de los siguientes: https://github.com/IMSoP/simplexml_debug

2

Esto también podría ser otra opción viable, lo que eliminaría ese código y hacer la vida poco más fácil.

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