2010-06-03 35 views
78

Me di cuenta de que al utilizar SimpleXMLElement en un documento que contiene esas etiquetas CDATA, el contenido es siempre NULL. ¿Cómo puedo solucionar esto?PHP: cómo manejar <! [CDATA [con SimpleXMLElement?

Además, disculpe los correos no deseados sobre XML aquí. He estado tratando de conseguir un guión basado en XML para trabajar durante varias horas ahora ...

<content><![CDATA[Hello, world!]]></content> 

He probado el primer golpe en Google si busca "CDATA SimpleXMLElement", pero que no funcionó.

+0

¿Cómo está intentando acceder al valor del nodo? Y, ¿SimpleXML es un requisito? – allnightgrocery

+0

Probé todas las demás funciones (xml2array y todo) que pude encontrar en la web y SimpleXML parece ser el único que da buenos resultados, excepto que el CDATA no funciona. – Angelo

+1

Hacemos muchos análisis XML en el trabajo usando DOMDocument (http://www.php.net/manual/en/class.domdocument.php). Funciona bien en el manejo de CDATA. Déle un código corto o publique un poco más para que veamos cómo está trabajando con SimpleXML. – allnightgrocery

Respuesta

138

Probablemente no esté accediendo correctamente. Puede sacarlo directamente o echarlo como una cadena. (En este ejemplo, el casting es superfluo, como eco hace automáticamente de todos modos)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>' 
); 
echo (string) $content; 

// or with parent element: 

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>' 
); 
echo (string) $foo->content; 

Es posible que tenga mejor suerte con LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>' 
    , null 
    , LIBXML_NOCDATA 
); 
+2

No, PHP omite CDATA completamente por alguna razón. ¿Alguna otra idea? – Angelo

+4

Entonces es un error. Actualice PHP/libxml hasta que funcione (nunca he tenido ningún problema con CDATA y SimpleXML). De lo contrario, puede probar suerte con LIBXML_NOCDATA. –

+0

Derecho encendido. Sin el LIBXML_NOCDATA, el XML aparece como falso, independientemente de cómo se realice. Pude probarlo con ambos métodos de creación ... $ x = new SimpleXMLElement ('', LIBXML_NOCDATA); $ y = simplexml_load_string ('', "SimpleXMLElement", LIBXML_NOCDATA); print_r ($ y); Sin esa opción, ambos son nulos. Solo quería respaldar su afirmación. – allnightgrocery

10

Esto hizo el truco para mí:

echo trim($entry->title); 
+0

Perfecto si necesita mantener el cdata (sin LIBXML_NOCDATA) – maztch

30

El LIBXML_NOCDATA es un tercer parámetro opcional de la función simplexml_load_file() . Esto devuelve el objeto XML con todos los datos CDATA convertidos en cadenas.

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA); 
echo "<pre>"; 
print_r($xml); 
echo "</pre>"; 


Fix CDATA in SimpleXML

+0

LIBXML_NOCDATA es lo que hizo que esto funcione para mi. PHP 5.3.5 –

+0

Su respuesta es la que explica el significado ** LIBXML_NOCDATA **, ¡gracias! –

4

esto está funcionando perfecto para mí.

$content = simplexml_load_string(
    $raw_xml 
    , null 
    , LIBXML_NOCDATA 
);