2009-08-07 11 views
5

J'ai un petit problème que je n'arrive pas à résoudre. J'ai un fichier XML (en fait c'est un fichier RSS) que j'essaye d'analyser avec PHP, mais la balise CDATA est vide.Analyse XML CDATA avec PHP

Voici le code XML et est ici le PHP file

Tout fonctionne bien, sauf que la balise de description n'est pas l'impression. Je serais très reconnaissant si quelqu'un pouvait aider.

+1

Pouvez-vous également publier la partie de code qui est en charge de l'analyse des données XML? Peut-être que le bug est dans le code, et pas dans les données ^^ –

+2

Avez-vous toujours le code XML et PHP? Pastebin a supprimé vos entrées. Si vous les avez, pourriez-vous éditer la question pour les ramener (ne les remettez pas sur pastebin, placez-les dans le texte de la question à la place.) Si vous ne pouvez pas, la question sera supprimée. Merci. –

+0

ID de pâte inconnue! – GoodSp33d

Répondre

16

Juste par curiosité, après avoir obtenu votre XML (je l'espère, je le détruis didnt't dans le processus - Je vais voir si je peux modifier l'OP pour le corriger):

  • avez-vous jeté la description à une chaîne?


Ce que je veux dire est que vous pouvez utiliser ceci:

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

mais il ne vous obtenir que:

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

Ce qui est pas belle ...


Vous devez convertir les données en chaîne, comme ceci:

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

Et vous obtenez les descriptions:

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) 

(En utilisant trim sur ceux qui pourraient se révéler utiles, d'ailleurs, si vous XML est indenté)


Else ... Eh bien , nous aurons probablement besoin de votre code PHP (au moins, serait utile de savoir comment vous arrivez à l'description tag ;-))


EDIT

Merci pour le XML reformatées!

Si je vais à Pastebin, dans la zone de texte au bas de la page, il y a un espace blanc au début du XML, avant la <?xml version="1.0" encoding="utf-8"?>

Si vous avez qu'un dans vos données XML réelles, ce sera une source de problème: il n'est pas valide XMl (la déclaration XML doit être la première chose dans les données XML).
Vous obtiendrez des erreurs comme celle-ci:

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

Pouvez-vous vérifier?
Et, si le problème est ici, vous devez activer error_reporting et display_errors ;-) Cela aiderait!


EDIT après avoir pris un coup d'oeil au fichier PHP:

Dans votre boucle, vous faites cela pour obtenir vos données de description:

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

Description ne contient aucun childNode , Je dirais ; Qu'en est-il de l'utilisation de nodeValue directement?
Comme ceci:

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

Il semble fonctionner mieux de cette façon :-)

En tant que sidenote, vous pourriez probablement faire la même chose pour les autres balises, je suppose; par exemple, cela semble fonctionner aussi:

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

Qu'est-ce que cela vous donne?


Une autre EDIT: et voici le code que je serais probablement utiliser:

$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 />'; 
} 

Remarque J'ai les données XML dans une chaîne, et je ne dois pas le chercher à partir d'une URL, donc j'utilise la méthode loadXML et non load. La différence majeure est que j'ai supprimé certains accès childNodes, que je ne pensais pas nécessaires.
Cela vous semble-t-il correct?

+0

Il n'y a pas d'espace vide ... Je suppose que c'est de ton côté. La déclaration XML est sur la toute première ligne. –

+0

Peut-être un problème avec Pastebin, ou, comme vous le dites, de mon côté; Je l'ai enlevé et c'est OK maintenant - j'ai édité ma réponse plusieurs fois (après avoir donné XML, et ensuite, après avoir donné du code PHP, et l'autre fois pour une solution "finale"), fournir plus d'informations; J'espère que cela t'aides ! –

+0

Merci Pascal pour votre aide, mais où avez-vous obtenu le $ str que vous chargez 'loadXML ($ str)? Pourriez-vous dire comment je peux changer mon code pour charger la chaîne à la place? –