Анализ XML-CDATA с PHP

У меня есть небольшая проблема, и я не могу понять, как ее решить. У меня есть XML (на самом деле это RSS) файл, который я пытаюсь разобрать с PHP, но тэг CDATA выходит пустым.

Вот код XML и вот файл PHP

Все работает отлично, за исключением того, что тег описания не печатает. Я был бы очень благодарен, если бы кто-то мог помочь.

Просто из любопытства, после получения вашего XML (надеюсь, я не уничтожил его в процессе – я посмотрю, смогу ли я отредактировать OP, чтобы исправить его) :

  • Вы бросили описание в строку?

Я имею в виду, что вы можете использовать это:

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

Но вам будет только это:

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

Что не так приятно …

Вам нужно передать данные в строку, например:

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

И вы получите описания:

 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) 

(Использование trim на них может оказаться полезным, кстати, если вы отделите XML)

Else … Ну, нам, вероятно, понадобится ваш php-код (по крайней мере, было бы полезно узнать, как вы попадаете в тег description 😉 )


РЕДАКТИРОВАТЬ

Спасибо за переработанный XML!

Если я перехожу к pastebin, в текстовом поле внизу страницы есть пробел в начале XML, перед <?xml version="1.0" encoding="utf-8"?>

Если у вас есть это в ваших реальных XML-данных, это будет источником проблемы: он недопустим XMl (XML-объявление должно быть первым в XML-данных).
Вы получите такие ошибки:

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

Вы можете это проверить?
И если проблема здесь, вы должны активировать error_reporting и display_errors 😉 Это поможет!


EDIT после просмотра файла PHP:

В вашем цикле for вы делаете это, чтобы получить свои данные описания:

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

Я бы сказал, что описание не содержит никакого дочернегоNode; как насчет использования nodeValue напрямую?
Как это :

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

Кажется, что это работает лучше 🙂

Как побочный элемент, вы, вероятно, могли бы сделать то же самое для других тегов, я полагаю; например, похоже, что это тоже работает:

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

Что это дает вам?


Еще один EDIT: и вот код, который я, вероятно, использовал бы:

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

Примечание. У меня есть данные XML в строке, и мне не нужно извлекать их из URL-адреса, поэтому я использую метод loadXML и не load .

Основное различие заключается в том, что я удалил некоторые образы childNodes, которые, как я считаю, не нужны.
Вам это кажется хорошо?