PHP使用XMLReader解析XML里面的CDATA

 2016-12-29 13:53

之前,我在《使用xmlreader读取xml数据》例举了一个方法,是用XMLReader来解析XML的。在实践中,我发现XML里面常常有一些CDATA代码无法被解析,这类方法在取值时无法被找到,从而出现了错误提示。

通过这两天网上的搜索发现,无法读取CDATA还是比较头疼的问题,并且也没找到较简单的XMLReader解析CDATA的方法。这很让我迷惑。

举例来说

我有一个网站:厘米屋,它的RSS地址为:http://limiwu.com/feed。我想把<item>下的title、link、description和pubDate解析出来。现在遇到是问题是description上有一个CDATA层级,导致我在上一篇上所写的$description值失效了。

附上XML:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">

<channel>
	<title>厘米屋</title>
	<atom:link href="http://limiwu.com/feed" rel="self" type="application/rss+xml" />
	<link>http://limiwu.com</link>
	<description>家具木制品的故事</description>
	<lastBuildDate>Mon, 26 Dec 2016 04:52:12 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.6.1</generator>
	<item>
		<title>按家装风格搭配自己的入户鞋柜</title>
		<link>http://limiwu.com/220.html</link>
		<comments>http://limiwu.com/220.html#respond</comments>
		<pubDate>Mon, 26 Dec 2016 04:51:30 +0000</pubDate>
		<dc:creator><![CDATA[紫铜炉]]></dc:creator>
		<category><![CDATA[家居木制品]]></category>
		<guid isPermaLink="false">http://limiwu.com/?p=220</guid>
		<description><![CDATA[一进入别人家里,映入眼帘的就是鞋柜或者入门装饰柜,这个柜子的风格
		决定您家整体的风格品味,所以在这方便还需要下点 [&#8230;]]]></description>
		<wfw:commentRss>http://limiwu.com/220.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	</item>
        ...
</channel>
</rss>
解决方法

经过我多次尝试,终于发现XMLReader是可以自行阅读CDATA里面的内容的。(这也太扯淡了吧)。只要将对应的nodeType值去匹配XMLReader::CDATA就可以了。

下面就是我的解决方法:

<?php
$indexUrl = 'http://limiwu.com/feed';
$reader = new XMLReader();
$reader->open($indexUrl);
$titles = $links = $descriptions = $pubDates = array();
 
while ($reader->read()){  
        if($reader->nodeType == XMLReader::ELEMENT){  
            $nodeName = $reader->name;
        }
        if($reader->nodeType == XMLReader::TEXT && !empty($nodeName) && $reader->depth == '4'){
            switch($nodeName){
                case 'title':
                    $title = $reader->value;
                    array_push($titles,$title);
                    break;  
                case 'link':
                    $link = $reader->value;
                    array_push($links,$link);
                    break;
                case 'description':
                    $description = $reader->value;
                    array_push($descriptions,$description);
                    echo $description.'<br />';
                    break;
                case 'pubDate':
                    $pubDate = $reader->value;
                    array_push($pubDates,$pubDate);
                    break;  
            }  
        }
        if($reader->nodeType == XMLReader::CDATA && !empty($nodeName) && $reader->depth == '4'){
            switch($nodeName){
                case 'title':
                    $title = $reader->value;
                    array_push($titles,$title);
                    break;  
                case 'link':
                    $link = $reader->value;
                    array_push($links,$link);
                    break;
                case 'description':
                    $description = $reader->value;
                    array_push($descriptions,$description);
                    break;
                case 'pubDate':
                    $pubDate = $reader->value;
                    array_push($pubDates,$pubDate);
                    break;  
            }  
        }
 }  


$reader->close();

echo $title.'<br />';
echo $link.'<br />';
echo $description.'<br />';
echo $pubDate.'<br />';
echo count($titles).'<br />';
echo count($links).'<br />';
echo count($descriptions).'<br />';
echo count($pubDates);

?>

我这里分了两个if的判断来做,不明白的朋友可以看之前的那个XMLReader常量的常量,那里面赫然标注了一个方法。我显然是没有弄明白那个意思,所以走了很多弯路。

现在看来,XMLReader解析CDATA是异常的简单啊。

作者头像

作者:紫铜炉

自由博主,网页设计师。我关注科技产品和个人博客发展,注重用户体验和界面优化。

 发表评论:

 评论列表

daguan 2018-06-18  21:06

https://abcdjue.weebly.com/
https://adamlindq.weebly.com/搬运工,非常抱歉

led光电产品 2018-06-11  18:49

需要好的光电产品请找我http://aLedLighting.com

液压扳手 2018-06-04  20:50

工业级的装配与维修解决方案液压扳手 http://www.pipercn.com

乐泰胶水 2018-05-23  11:38

用胶水就用乐泰胶水和可赛新胶水这才是正确的选择 https://www.hyhaote.com