У меня есть небольшая проблема, и я не могу понять, как ее решить. У меня есть 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, которые, как я считаю, не нужны.
Вам это кажется хорошо?