2009-08-07 39 views
5

Tengo un pequeño problema que no puedo resolver. Tengo un archivo XML (en realidad es RSS) que estoy tratando de analizar con PHP, pero la etiqueta CDATA aparece en blanco.Analizando XML CDATA con PHP

Aquí está el código XML y aquí está la PHP file Todo

funciona bien, excepto que la etiqueta de la descripción no está imprimiendo. Estaría muy agradecido si alguien pudiera ayudar.

+1

¿También puede publicar la parte del código que está a cargo del análisis de los datos XML? Tal vez el error está en el código, y no en los datos ^^ –

+2

¿Todavía tiene el código XML y PHP? Pastebin ha eliminado tus entradas. Si los tiene, podría editar la pregunta para devolverlos (no los vuelva a poner en pastebin, póngalos en el texto de la pregunta). Si no puede, la pregunta se eliminará. Gracias. –

+0

unknown paste id! – GoodSp33d

Respuesta

16

Sólo por curiosidad, después de conseguir su XML (espero didnt't destruirlo en el proceso - Voy a ver si puedo editar el OP para corregirlo):

  • ¿Echaste la descripción a una cadena?


Lo que quiero decir es que usted podría utilizar esto:

$xml = simplexml_load_string($str); 
foreach ($xml->channel->item as $item) { 
    var_dump($item->description); 
} 

Pero sólo le conseguiría que:

object(SimpleXMLElement)[5] 
object(SimpleXMLElement)[3] 

que no es tan agradable ...


Necesita convertir los datos a una cadena, como esta:

$xml = simplexml_load_string($str); 
foreach ($xml->channel->item as $item) { 
    var_dump((string)$item->description); 
} 

Y se obtiene las descripciones:

string ' 

This is one of the content that I need printed on the screen, but nothing is happening. Please, please...output something... <br /><br /> <b>Showing</b>: 2 weeks<br /> <b>Starting On</b>: August 7, 2009 <br /> <b>Posted On</b>: August 7, 2009 <br /> 
<a href="http://www.mysite.com">click to view</a> 
      ' (length=329) 

string ' 

Another content...This is another of the content that I need printed on the screen, but nothing is happening. Please, please...output something... <br /><br /> <b>Showing</b>: 2 weeks<br /> Starting On: August 7, 2009 <br /> <b>Posted On</b>: August 7, 2009 
; 
       ' (length=303) 

(Usando trim en los que podría resultar útil, por cierto, si usted tiene sangría XML)


lo demás ... Bueno , probablemente necesitemos su código php (al menos, sería útil saber cómo está llegando a la etiqueta description;-))


EDITAR

Gracias por el XML reformated!

Si voy a pastebin, en el área de texto en la parte inferior de la página, hay un espacio en blanco al principio del XML, antes de la <?xml version="1.0" encoding="utf-8"?>

Si tiene que uno de los datos XML reales, será una fuente de problema: no es XMl válido (la declaración XML tiene que ser la primera cosa en los datos XML).
Usted obtendrá errores como éste:

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : XML declaration allowed only at the start of the document 

Se puede comprobar que?
Y, si el problema está aquí, debe activar error_reporting y display_errors ;-) ¡Eso ayudaría!


Edición después de echar un vistazo al archivo PHP:

En su bucle, que están haciendo esto para obtener su descripción de datos:

$item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue; 

descripción no contiene ninguna childNode , Yo diría que ; ¿qué hay de usar su nodeValue directamente?
De esta manera:

$item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->nodeValue; 

Parece estar funcionando mejor de esta manera :-)

Como anotación al margen, que probablemente se podría hacer lo mismo para otras etiquetas, supongo; por ejemplo, esto parece estar funcionando también:

$item_title=$x->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
$item_link=$x->item($i)->getElementsByTagName('link')->item(0)->nodeValue; 

¿Qué le ofrece esto?


Otra EDIT: y aquí está el código, probablemente, me gustaría utilizar:

$xmlDoc = new DOMDocument(); 
$xmlDoc->loadXML($str);   // I changed that because I have the XML data in a string 

//get elements from "<channel>" 
$channel = $xmlDoc->getElementsByTagName('channel')->item(0); 
$channel_title = $channel->getElementsByTagName('title')->item(0)->nodeValue; 
$channel_link = $channel->getElementsByTagName('link')->item(0)->nodeValue; 
$channel_desc = $channel->getElementsByTagName('description')->item(0)->nodeValue; 

//output elements from "<channel>" 
echo "<p><a href='" . $channel_link . "'>" . $channel_title . "</a>"; 
echo "<br />"; 
echo $channel_desc . "</p>"; 

//get and output "<item>" elements 
$x = $xmlDoc->getElementsByTagName('item'); 
for ($i=0 ; $i<=1 ; $i++) { 
    $item_title = $x->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
    $item_link = $x->item($i)->getElementsByTagName('link')->item(0)->nodeValue; 
    $item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->nodeValue; 
    echo ("<p><a href='" . $item_link 
    . "'>" . $item_title . "</a>"); 
    echo ("<br />"); 
    echo ($item_desc . "</p>"); 
    echo' <p />'; 
} 

Nota tengo los datos XML en una cadena, y no necesito a buscarla a una dirección URL, entonces estoy usando el método loadXML y no el load.

La principal diferencia es que eliminé algunos accesos de childNodes, que creo que no eran necesarios.
¿Te parece bien?

+0

No hay espacio en blanco ... Supongo que es de tu lado. La declaración XML está en la primera línea. –

+0

Tal vez un problema con Pastebin, o, como dices, de mi lado; Lo he eliminado y ahora está bien. He editado mi respuesta bastante veces (después de que me dio XML, y luego, después de que me dio el código PHP, y el otro momento para una solución "final"), proporcionar más información; espero que esto ayude ! –

+0

Gracias Pascal por su ayuda, pero ¿de dónde sacó los $ str que está cargando 'loadXML ($ str)? ¿Podría decirme cómo puedo cambiar mi código para cargar cadena también? –