2009-08-07 7 views
5

Ich habe ein kleines Problem, das ich nicht herausfinden kann, wie man löst. Ich habe eine XML-Datei (eigentlich RSS), die ich mit PHP zu analysieren versuche, aber das CDATA-Tag ist leer.Parsing XML CDATA mit PHP

Hier ist der XML-Code und hier ist das PHP file

Alles funktioniert gut, außer dass die Beschreibung Tag ist nicht Druck. Ich wäre sehr dankbar, wenn jemand helfen könnte.

+1

Können Sie auch den Teil des Codes veröffentlichen, der für das Parsen der XML-Daten verantwortlich ist? Vielleicht ist der Fehler im Code und nicht in den Daten ^^ –

+2

Haben Sie noch den XML- und PHP-Code? Pastebin hat deine Einträge gelöscht. Wenn du sie hast, könntest du die Frage bearbeiten, um sie zurück zu bringen (setze sie nicht wieder in pastebin, sondern füge sie stattdessen in den Fragetext ein.) Wenn du es nicht kannst, wird die Frage gelöscht. Vielen Dank. –

+0

unbekannte Paste ID! – GoodSp33d

Antwort

16

Nur aus Neugier, nach dem XML immer (ich hoffe, dass ich es in dem Prozess zerstören didnt't - ich werde sehen, ob ich die OP bearbeiten kann es zu korrigieren):

  • hast du die Beschreibung in eine Zeichenkette umgewandelt?


Was ich meine ist, dass Sie diese verwenden:

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

Aber es würde Sie nur bekommen, dass:

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

was nicht so schön ist ...


Sie müssen die Daten wie folgt in eine Zeichenfolge umwandeln:

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

Und Sie die Beschreibungen erhalten:

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) 

(Mit trim auf denen vielleicht als nützlich erweisen, btw, wenn Sie XML Einbuchtungen)


Else ... Gut , wir werden wahrscheinlich Ihren PHP-Code brauchen (zumindest wäre es nützlich zu wissen, wie Sie zum description Tag kommen ;-))


EDIT

Danke für die Reformierte XML!

Wenn ich auf Pastebin gehen, in das Textfeld am unteren Rand der Seite befindet sich ein Leerraum am Anfang des XML, vor dem <?xml version="1.0" encoding="utf-8"?>

Wenn Sie, dass in Ihrem echten XML-Daten haben, Es wird eine Quelle von Problemen sein: Es ist kein gültiges XMl (die XML-Deklaration muss das erste Ding in den XML-Daten sein).
Sie werden diese Fehler wie man bekommen:

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

Können Sie das überprüfen?
Und wenn das Problem hier ist, sollten Sie error_reporting und display_errors aktivieren ;-) Das würde helfen!


EDIT nach einem Blick auf die PHP-Datei unter:

In Ihrer for-Schleife, die Sie dies tun, um Ihre Beschreibung Daten zu erhalten:

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

Beschreibung enthält keine childNode , Ich würde sagen ; Was ist mit der direkten Verwendung von nodeValue?
So:

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

Es scheint besser zu funktionieren auf diese Weise :-)

Als Nebenbei bemerkt, werden Sie wahrscheinlich für andere Tags das gleiche tun könnte, nehme ich an; das scheint zum Beispiel auch zu funktionieren:

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

Was gibt Ihnen das?


Another EDIT: und hier ist der Code, den ich wahrscheinlich verwenden würde:

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

Hinweis ich die XML-Daten in einem String haben, und ich brauche es nicht von einer URL zu holen, also verwende ich die loadXML Methode und nicht load.

Der Hauptunterschied ist, dass ich einige childNodes-Zugriffe entfernt habe, die ich für nicht notwendig hielt.
Scheint Ihnen das OK?

+0

Es gibt keine Leerzeichen ... Ich denke, es ist von deiner Seite. Die XML-Deklaration befindet sich in der ersten Zeile. –

+0

Vielleicht ein Problem mit Pastebin oder, wie du sagst, auf meiner Seite; Ich habe es entfernt und es ist jetzt in Ordnung - ich habe meine Antwort einige Male (nachdem Sie XML gegeben haben, und dann, nachdem Sie PHP-Code und die andere Zeit für eine "endgültige" Lösung gegeben haben), bearbeitet stellen Sie mehr Informationen zur Verfügung; hoffe das hilft ! –

+0

Danke Pascal für Ihre Hilfe, aber wo haben Sie die $ str Sie laden loadXML ($ str) bekommen? Könnten Sie sagen, wie ich meinen Code ändern kann, um stattdessen auch String zu laden? –