用PHP解析XML CDATA

问题描述:

我有一个小问题,我无法弄清楚如何解决。 我有一个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

只是出于好奇,让你的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