Al fin luego de mucho batallar hemos dado con el resultado de este enigma que muchos usuarios de esta web han presentado. Si tienes algún detalle que aportar puedes dejar tu información.
Solución:
Probablemente esté siendo engañado al pensar que falta el CDATA al usar 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 tu corres echo $nodes[0]->Description
, encontrará que su CDATA sale bien. Lo que pasa es que PHP sabe que echo
espera un string, así que le pide uno a SimpleXML; SimpleXML responde con todos los string contenido, incluido CDATA.
Para llegar al máximo string contenido de manera confiable, simplemente dígale a PHP que lo que quiere es un string utilizando el (string)
operador de conversión, por ejemplo $description = (string)$nodes[0]->Description
.
Para depurar objetos SimpleXML y no dejarse engañar por peculiaridades como esta, use una función de depuración dedicada como una de estas: https://github.com/IMSoP/simplexml_debug
SimpleXML tiene un pequeño problema con CDATA, así que use:
$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA);
if(!empty($xml))
$nodes = $xml->xpath('//xml/events');
print_r( $nodes );
Esto te dará:
Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[date] => 01-10-2009
[color] => 0x99CC00
[selected] => true
)
[event] => SimpleXMLElement Object
(
Obtener contenido de cdata al analizar el archivo xml
=> You can use HTML and CSS
[description] => This is the description
)
)
)
Esta también podría ser otra opción viable, que eliminaría ese código y haría la vida un poco más fácil.
$xml = str_replace("
Si piensas que te ha sido útil nuestro post, agradeceríamos que lo compartas con más juniors y nos ayudes a extender nuestra información.