2009-08-07 12 views
5

Mam mały problem, że nie mogę wymyślić, jak rozwiązać. Mam plik XML (faktycznie jest to RSS), który próbuję analizować za pomocą PHP, ale znacznik CDATA jest pusty.Parsowanie XML CDATA z PHP

Oto kod XML i oto PHP file

Wszystko działa poprawnie, oprócz tego, że tag opis nie drukuje. Byłbym bardzo wdzięczny, gdyby ktoś mógł pomóc.

+1

Czy można również opublikować część kodu, która jest odpowiedzialna za parsowanie danych XML? Może błąd jest w kodzie, a nie w danych ^^ –

+2

Czy nadal masz kod XML i PHP? Pastebin usunął twoje wpisy. Jeśli je masz, możesz edytować pytanie, aby je przywrócić (nie umieszczaj ich ponownie w pastebin, zamiast tego wstawiaj je do tekstu pytania). Jeśli nie, pytanie zostanie usunięte. Dzięki. –

+0

pasta nieznanego id! – GoodSp33d

Odpowiedz

16

Tak z ciekawości, po otrzymaniu XML (mam nadzieję didnt't Zniszczę go w procesie - Zobaczę, czy mogę edytować OP to poprawić):

  • czy rzuciłeś opis na ciąg?


Chodzi o to, można użyć to:

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

Ale to ci tylko to:

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

co nie jest miłe ...


Musisz odrzucić dane do łańcucha, jak poniżej:

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

i masz opisy:

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) 

(Korzystanie trim na te mogą okazać się przydatne, btw, jeśli XML jest wcięte)


Else ... No prawdopodobnie będziemy potrzebować twojego kodu php (przynajmniej byłby przydatny by wiedzieć, jak docierasz do znacznika description;-))


EDIT

Dzięki za sformatowane XML!

Jeśli pójdę do Pastebin w textarea w dolnej części strony znajduje się biała przestrzeń na początku pliku XML, przed <?xml version="1.0" encoding="utf-8"?>

Jeśli masz, że jeden na swoich prawdziwych danych XML, będzie to źródłem problemu: nie jest poprawne XM1 (deklaracja XML musi być pierwsza rzecz: w danych XML).
Dostaniesz błędy takie jak ten:

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

można sprawdzić, czy?
A jeśli problem jest tutaj, należy aktywować error_reporting i display_errors ;-) To mogłoby pomóc!


EDIT po przyjrzeniu pliku PHP:

w twojej pętli, robisz to, aby uzyskać opis dane:

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

opis nie zawiera żadnych childNode , Powiedziałbym ; A co z bezpośrednim użyciem parametru nodeValue?
Jak to:

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

Wydaje się działać lepiej w ten sposób :-)

Jako marginesie, prawdopodobnie można zrobić to samo dla innych znaczników, jak sądzę; na przykład to też działa:

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

Co to daje?


Kolejny edit: i tutaj jest kod I prawdopodobnie używać:

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

Uwaga Mam dane XML w ciągu znaków, a nie muszę sprowadzić go z adresu URL, więc używam metody loadXML, a nie load.

Główną różnicą jest to, że usunąłem niektóre dostępy do ChildNodes, które moim zdaniem nie były konieczne.
Czy wydaje ci się to w porządku?

+0

Nie ma pustej przestrzeni ... Myślę, że to po twojej stronie. Deklaracja XML znajduje się na pierwszej linii. –

+0

Może problem z Pastebinem, lub, jak mówisz, po mojej stronie; Usunąłem go i jest już OK - kilka razy zredagowałem swoją odpowiedź (po tym, jak podałeś XML, a potem, po podaniu kodu PHP, a innym razem na "ostateczne" rozwiązanie), dostarczyć więcej informacji; mam nadzieję że to pomoże ! –

+0

Dzięki Pascal za twoją pomoc, ale skąd wziąłeś $ str, że ładujesz 'loadXML ($ str)? Czy możesz powiedzieć, w jaki sposób mogę zmienić mój kod, aby załadować ciąg również zamiast? –