處理內容有&特殊字符thinkphp返回xml無法解析的問題<![CDATA[xxx]]>
// xml 轉義特殊字符 如&'" <![CDATA["標記開始,以"]]>標記結束
不能直接把data進行for循環,否則里面的數組對象就變成一個對象字符了
// xml 轉義特殊字符 如&'" <![CDATA["標記開始,以"]]>標記結束
$xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : '<![CDATA['.$val.']]>';
必須是最終文本值才能加上這個<![CDATA[xxx]]>
測試xml特殊字符&&&#@R<>>d?#dfasf*()@!~-=+_''"":;,./
ThinkPHP/Common/functions.php
1 /** 2 * XML編碼 3 * @param mixed $data 數據 4 * @param string $root 根節點名 5 * @param string $item 數字索引的子節點名 6 * @param string $attr 根節點屬性 7 * @param string $id 數字索引子節點key轉換的屬性名 8 * @param string $encoding 數據編碼 9 * @return string 10 */ 11 function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') { 12 if(is_array($attr)){ 13 $_attr = array(); 14 foreach ($attr as $key => $value) { 15 $_attr[] = "{$key}=\"{$value}\""; 16 } 17 $attr = implode(' ', $_attr); 18 } 19 $attr = trim($attr); 20 $attr = empty($attr) ? '' : " {$attr}"; 21 $xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>"; 22 $xml .= "<{$root}{$attr}>"; 23 $xml .= data_to_xml($data, $item, $id); 24 $xml .= "</{$root}>"; 25 return $xml; 26 } 27 28 /** 29 * 數據XML編碼 30 * @param mixed $data 數據 31 * @param string $item 數字索引時的節點名稱 32 * @param string $id 數字索引key轉換為的屬性名 33 * @return string 34 */ 35 function data_to_xml($data, $item='item', $id='id') { 36 $xml = $attr = ''; 37 foreach ($data as $key => $val) { 38 if(is_numeric($key)){ 39 $id && $attr = " {$id}=\"{$key}\""; 40 $key = $item; 41 } 42 $xml .= "<{$key}{$attr}>"; 43 // xml 轉義特殊字符 如& 以<![CDATA[標記開始,以]]>標記結束,必須是最終文本值才能加上這個<![CDATA[xxx]]> 44 $xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : '<![CDATA['.$val.']]>'; 45 $xml .= "</{$key}>"; 46 } 47 return $xml; 48 }
---------------------------------
< < 小於號
> > 大於號
& & 和
' ' 單引號
" " 雙引號
實體必須以符號"&"開頭,以符號";"結尾。 注意: 只有"<" 字符和"&"字符對於XML來說是嚴格禁止使用的。
剩下的都是合法的,為了減少出錯,使用實體是一個好習慣。
基本的html轉義字符特殊字符
字符 十進制 轉義字符
“ " "
& & &
< < <
> > >
空格  
-----------------------------