2009-08-07 110 views
5

我有一個小問題,我無法弄清楚如何解決。 我有一個XML(實際上是RSS)文件,我試圖用PHP解析,但CDATA標籤空白。用PHP解析XML CDATA

這裏的XML代碼 和這裏的PHP file

一切正常,只是描述標籤不打印。 如果有人能提供幫助,我將不勝感激。

+1

你還可以發佈負責解析XML數據的代碼部分嗎?也許錯誤在代碼中,而不是在數據中^^ – 2009-08-07 20:03:23

+2

你還有XML和PHP代碼嗎? Pastebin刪除了你的條目。如果你有他們,你可以編輯問題讓他們回來(不要把它們放在pastebin上,而是把它們放到問題文本中)。如果你不能,問題將被刪除。謝謝。 – 2011-05-25 07:19:16

+0

未知的粘貼ID! – GoodSp33d 2012-04-27 14:47:23

回答

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是縮進)


否則......好吧,我們可能會需要你的PHP代碼(至少,將是有益知道你是如何得到的description標籤;-)


編輯

感謝重新格式化XML!

如果我去引擎收錄,在頁面底部的textarea的,有在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_reportingdisplay_errors ;-)這將有助於!

在你的循環,你這樣做是爲了讓你的描述數據:

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

描述不包含任何childNode在PHP文件服用後一看


編輯, 我會說 ;那麼直接使用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; 

這會給你什麼?


另一個編輯:這裏是我的代碼可能會使用:

$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訪問,我覺得沒有必要。
這對你來說好像嗎?

+0

沒有空白......我想這是從你身邊開始的。 XML聲明位於第一行。 – 2009-08-07 20:27:56

+0

也許是Pastebin的問題,或者如你所說,在我身邊;我已經刪除它,現在就可以了 - 我編輯了我的答案很多次(在給出XML之後,然後在給出PHP代碼之後,又一次給出「最終」解決方案之後),提供更多信息;希望這可以幫助 ! – 2009-08-07 20:33:27

+0

感謝Pascal的幫助,但是您在哪裏得到了您正在加載的$ str'loadXML($ str)? 你能告訴我如何改變我的代碼來加載字符串嗎? – 2009-08-07 20:43:02