2009-08-07 2 views
5

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

Вот XML код и вот PHP file

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

+1

Можете ли вы также опубликовать часть кода, которая отвечает за разбор XML-данных? Может быть, ошибка указана в коде, а не в данных ^^ –

+2

У вас все еще есть код XML и PHP? Pastebin удалил ваши записи. Если у вас есть они, не могли бы вы изменить вопрос, чтобы вернуть их (не ставьте их обратно на pastebin, вместо этого помещайте их в текст вопроса.) Если вы не можете, вопрос будет удален. Благодарю. –

+0

неизвестный паста id! – GoodSp33d

ответ

16

Просто из любопытства, после получения вашего XML (я надеюсь, что я didnt't уничтожить его в процессе - я буду видеть, если я могу редактировать 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;-))


EDIT

Спасибо за reformated 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 файл:

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

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

описание не содержит каких-либо childNode , Я бы сказал ; как насчет использования 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.

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

+0

Нет пустого места ... Наверное, это с вашей стороны. Объявление XML находится в первой строке. –

+0

Возможно, проблема с Pastebin, или, как вы говорите, на моей стороне; Я удалил его, и теперь все в порядке - я отредактировал свой ответ довольно много раз (после того, как вы дали XML, а затем, после того, как вы дали PHP-код, и в другое время для «окончательного» решения), чтобы предоставлять больше информации; надеюсь это поможет ! –

+0

Спасибо Pascal за вашу помощь, но откуда вы взяли $ str, загружаете loadXML ($ str)? Не могли бы вы рассказать, как я могу изменить свой код, чтобы вместо этого загружать строку? –