<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[实践Ok]使用php函数simplexml_load_file 解析带有cdata的xml方法。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Wed, 16 Jan 2013 09:41:03 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在XML文档中使用类似&quot;&lt;&quot; 的字符, 那么解析器将会出现错误，因为解析器会认为这是一个新元素的开始,组合XML字符串时遇到了&lt; 。需要转义。<br/>PHP5自带的simplexml_load_file对这个xml解析内容为空是因内容里包含：<br/>&lt;![CDATA[标题3]]&gt;&nbsp;&nbsp;内容里有 &lt;&gt; 特殊字符，所以，解析不到值。<br/><br/>又是一个鸡肋，为什么要说又呢？呵呵。<br/><br/>XML 的 CDATA，即 &lt;![CDATA[ 与 ]]&gt; 之间可以放 &lt;、&gt;、&amp;、&#039;、&quot; 字符，由于 CDATA 中的内容不会被解析，所以上述字符在 CDATA 中不会造成 XML 的错误，否则“&lt;”会被当作一个标签的开始。<br/><br/>但是，重要了。CDATA 中仍然不能放一些东西：<br/><br/>一是放特殊符号危险，比如“”，可能某些解析器认识，某些解析器不认识，解决办法：XmlTextReader 解析 XML 时遇到特殊字符出错。<br/>二是不能放 &lt;![CDATA[ 和 ]]&gt;。像我们的 IT 类文章中可能经常出现这些字符，出现了，若写在 XML 势必出错，解决办法是用 System.Web.HttpUtility.HtmlEncode 将 &lt;、&gt;、&amp;、&#039;、&quot; 进行编码，取值时再解码。那问题来了，既然已经编码了，还要 CDATA 做什么？<br/><br/><br/>最后，在一个兄弟那儿看到是支持CDATA的PHP也可以解析，如下：<br/>http://hi.baidu.com/yinqinlong502/item/e4dfc900a977ed1acc34eae9<br/>php 解析xml遇到cdata怎么办<br/>用$rss = simplexml_load_file ( &#039;11111.xml&#039;, &#039;SimpleXMLElement&#039;, LIBXML_NOCDATA );哎就为了这么个函数我还去写正则准备替换了，白白废了我两小时，shit!!!以后多注意下那些函数的可选参数吧。长点教训.<br/>直接输入xml内容为参数的也支持CDATA的解析，如下：<br/><textarea name="code" class="php" rows="15" cols="100">
$rss = simplexml_load_file ( &#039;11111.xml&#039;, &#039;SimpleXMLElement&#039;, LIBXML_NOCDATA );
$xmlCode&nbsp;&nbsp; = simplexml_load_string($this-&gt;xmlContents, &#039;SimpleXMLElement&#039;, LIBXML_NOCDATA);
</textarea><br/><br/><br/>需要解析的XML格式为：<br/>实践如下：<br/>xml文件：<br/><textarea name="code" class="java" rows="15" cols="100">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;DATAS&gt;

&lt;DATA&gt;
&lt;TITLE&gt;&lt;![CDATA[标题3]]&gt;&lt;/TITLE&gt;
&lt;URL&gt;&lt;![CDATA[http://dinshiju.cntv.cn]]&gt;&lt;/URL&gt;
&lt;THUMB&gt;&lt;![CDATA[http://p2.img.cctvpic.com/photoAlbum/page/performance/img/2013/1/14/1358132785557_460.jpg]]&gt;&lt;/THUMB&gt;
&lt;/DATA&gt;

&lt;DATA&gt;
&lt;TITLE&gt;&lt;![CDATA[标题2]]&gt;&lt;/TITLE&gt;
&lt;URL&gt;&lt;![CDATA[http://www.cntv.cn]]&gt;&lt;/URL&gt;
&lt;THUMB&gt;&lt;![CDATA[http://p1.img.cctvpic.com/photoAlbum/page/performance/img/2013/1/14/1358132556020_927.jpg]]&gt;&lt;/THUMB&gt;
&lt;/DATA&gt;

&lt;DATA&gt;
&lt;TITLE&gt;&lt;![CDATA[标题1]]&gt;&lt;/TITLE&gt;
&lt;URL&gt;&lt;![CDATA[http://baidu.com]]&gt;&lt;/URL&gt;
&lt;THUMB&gt;&lt;![CDATA[http://p5.img.cctvpic.com/photoAlbum/page/performance/img/2013/1/14/1358132536506_532.jpg]]&gt;&lt;/THUMB&gt;
&lt;/DATA&gt;

&lt;/DATAS&gt;

</textarea><br/><br/>解析PHP代码,仅仅对当前的xml做解析：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
function cdataXML2Arr($parseXmlsUrl)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;$xmldata = simplexml_load_file ( $parseXmlsUrl, &#039;SimpleXMLElement&#039;, LIBXML_NOCDATA );

&nbsp;&nbsp;&nbsp;&nbsp;$arrayData = array();
&nbsp;&nbsp;&nbsp;&nbsp;$outArr = array();
&nbsp;&nbsp;&nbsp;&nbsp;$listcount = count($xmldata-&gt;DATA);
&nbsp;&nbsp;&nbsp;&nbsp;for($i=0;$i&lt;$listcount;$i++)&#123; //第二部分，直接把 $xml 对象转换为数组。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$title = (array)$xmldata-&gt;DATA[$i]-&gt;TITLE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url = (array)$xmldata-&gt;DATA[$i]-&gt;URL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$thumb= (array)$xmldata-&gt;DATA[$i]-&gt;THUMB;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrayData = array(&#039;TITLE&#039;=&gt;$title[0],&#039;URL&#039;=&gt;$url[0],&#039;THUMB&#039;=&gt;$thumb[0]);//取数组第0键值
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$outArr[] =&nbsp;&nbsp;$arrayData;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;return $outArr;
&#125;
//test cdata function
$parseXmlsUrl = &quot;http://localhost/aaa/index.xml&quot;;
$xmlsArr = cdataXML2Arr($parseXmlsUrl);
print_r($xmlsArr);
?&gt;
</textarea><br/><br/>进一步写成类更加宽泛的适应调用（部门之间有不遵守xml规范的，有的返回的xml第一行换行了需要先去掉之才能传入php函数中去解析正常，这就是在中国的实际开发情况。）该类可以直接传入xml格式内容，也可以直接输入xml的路径或则url进行解析：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
//输出UTF8编码
header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
?&gt;

&lt;?php //直接传入xml内容转为数组的XML类调用方法
$xmlFileOrxmlUrl = &#039;http://dianshiju.cntv.cn/dianshiju/xml/index.xml&#039;;
$xmlContents = file_get_contents($xmlFileOrxmlUrl);

$xmlToArrObj = new XmlToArr($xmlContents);
//直接传入xml格式数据
$xmlToArrResult = $xmlToArrObj -&gt; getxmlToArrResult();
print_r($xmlToArrResult);
?&gt;

&lt;?php //传入xml文件路径转为数组的XML类调用方法
$xmlFileOrxmlUrl = &#039;http://dianshiju.cntv.cn/dianshiju/xml/index.xml&#039;;
$xmlToArrObj = new XmlToArr($xmlFileOrxmlUrl, &quot;xmlUrlOrPath&quot;);
$xmlToArrResult = $xmlToArrObj -&gt; getxmlToArrResult();
print_r($xmlToArrResult);
?&gt;

&lt;!--下面是这个解析Xml类的实体，可以单独分开并包含供上面函数调用。--&gt;
&lt;?php
/**
 * 将xml转为数组类
 *参数：文件地址或者Url地址
 *返回：该xml的Url地址转为数组相关情况
 * @author&nbsp;&nbsp;jackxiang
 * @version 12692 2013-01-17 10:46:04Z jackxiang $
 */
class XmlToArr &#123;
&nbsp;&nbsp;&nbsp;&nbsp;//xml文件或url
&nbsp;&nbsp;&nbsp;&nbsp;public $xmlFileOrxmlUrl = &quot;&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;//xml内容 （需要经过过滤等）
&nbsp;&nbsp;&nbsp;&nbsp;public $xmlContents = &quot;&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;//xml转成的数组的结果
&nbsp;&nbsp;&nbsp;&nbsp;public $xmlToArrResult = array();

&nbsp;&nbsp;&nbsp;&nbsp;//读取文件超时时间设置(默认3秒)
&nbsp;&nbsp;&nbsp;&nbsp;public $timeOut = 3;

&nbsp;&nbsp;&nbsp;&nbsp;public function xmlToArr($xmlContentsOrxmlFileUrl, $inputType = &quot;xmlcontents&quot;, $timeOut = 3) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($inputType == &quot;xmlcontents&quot;) &#123;//输入的是xml内容
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlContents = $xmlContentsOrxmlFileUrl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//直接赋值给类里的xml内容
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;//xmlUrlOrPath:输入的是xml地址或则Url形式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xmlFileOrxmlUrl = $xmlContentsOrxmlFileUrl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是Url或则本地文件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlFileOrxmlUrl = $xmlFileOrxmlUrl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//文件句柄或则Url传入类变量
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; timeOut = $timeOut;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置读取xml文件的超时时间
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; vita_get_url_content();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取xml文件内容

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; filterXmlContents();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//过滤掉不符合xml规则的 刚开始就换行等去掉
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; transXmlToArr();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把xml内容转成数组
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;public function filterXmlContents() &#123;//对xml里的相关字符做过滤
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlContents = str_replace(array(&quot;&#92;r&quot;, &quot;&#92;n&quot;), &quot;&quot;, $this -&gt; xmlContents);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//去掉空字符及换行等空字符
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//获取数据兼容file_get_contents与curl
&nbsp;&nbsp;&nbsp;&nbsp;public function vita_get_url_content() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (function_exists(&#039;file_get_contents&#039;)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx = stream_context_create(array(&#039;http&#039; =&gt; array(&#039;timeout&#039; =&gt; $this -&gt; timeOut)));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlContents = @file_get_contents($this -&gt; xmlFileOrxmlUrl, 0, $ctx);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strlen($this -&gt; xmlContents) == 0) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;文件：&quot; . __FILE__ . &quot;行：&quot; . __LINE__ . &quot;XML文件读取失败或其返回为空，请检查!&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_URL, $this -&gt; xmlFileOrxmlUrl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this -&gt; timeOut);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$file_contents = curl_exec($ch);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this -&gt; xmlContents;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//解析xml函数
&nbsp;&nbsp;&nbsp;&nbsp;public function transXmlToArr() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xml_parser = xml_parser_create();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先初步检查是否是xml格式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (xml_parse($xml_parser, $this -&gt; xmlContents, true)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xml_parser_free($xml_parser);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放掉判断的句柄
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xmlCode = simplexml_load_string($this -&gt; xmlContents, &#039;SimpleXMLElement&#039;, LIBXML_NOCDATA);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlToArrResult = $this -&gt; get_object_vars_final($xmlCode);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;//不符合xml基本格式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this -&gt; xmlToArrResult = &#039;&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die(&quot;文件：&quot; . __FILE__ . &quot;行：&quot; . __LINE__ . &quot;数据结构分析不是xml格式，请检查。&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;public function get_object_vars_final($obj) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_object($obj)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$obj = get_object_vars($obj);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($obj)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($obj as $key =&gt; $value) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$obj[$key] = $this -&gt; get_object_vars_final($value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $obj;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;public function getxmlToArrResult() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this -&gt; xmlToArrResult;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回转化成的数组
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&#125;;
?&gt;
</textarea><br/>更多参考：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.cnblogs.com/songsh96/archive/2007/07/10/812126.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://hi.baidu.com/nicelinda/item/37e13d8cb820fec8b17154ac<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.php100.com/manual/w3school/xml/xml_cdata.asp.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践Ok]使用php函数simplexml_load_file 解析带有cdata的xml方法。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>