xmltojson中遇到的CDATA变空以及json_encode成unicode的解决方法
functionxml_to_json($source){
if(is_file($source)){//传的是文件,还是xml的string的判断
$xml_array=simplexml_load_file($source);
}else{
$source=uncdata($source);
$xml_array=simplexml_load_string($source);
}
$json=json_encode($xml_array);//php5,以及以上,如果是更早版本,请查看JSON.php
returndecodeUnicode($json);
}
//处理CDATA
functionuncdata($xml)
{
//States:
//
//'out'
//'<'
//'<!'
//'<!['
//'<![C'
//'<![CD'
//'<![CDAT'
//'<![CDATA'
//'in'
//']'
//']]'
//
//(Yes,thestatesarepresentedbystrings.)
//
$state='out';
$a=str_split($xml);
$new_xml='';
foreach($aAS$k=>$v){
//Dealwith"state".
switch($state){
case'out':
if('<'==$v){
$state=$v;
}else{
$new_xml.=$v;
}
break;
case'<':
if('!'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<!':
if('['==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![':
if('C'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![C':
if('D'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![CD':
if('A'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![CDA':
if('T'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![CDAT':
if('A'==$v){
$state=$state.$v;
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'<![CDATA':
if('['==$v){
$cdata='';
$state='in';
}else{
$new_xml.=$state.$v;
$state='out';
}
break;
case'in':
if(']'==$v){
$state=$v;
}else{
$cdata.=$v;
}
break;
case']':
if(']'==$v){
$state=$state.$v;
}else{
$cdata.=$state.$v;
$state='in';
}
break;
case']]':
if('>'==$v){
$new_xml.=str_replace('>','>',
str_replace('>','<',
str_replace('"','"',
str_replace('&','&',
$cdata))));
$state='out';
}else{
$cdata.=$state.$v;
$state='in';
}
break;
}//switch
}
//
//Return.
//
return$new_xml;
}
//UNICODE转UTF-8
functiondecodeUnicode($str)
{
returnpreg_replace_callback('/\\\\u([0-9a-f]{4})/i',
create_function(
'$matches',
'returnmb_convert_encoding(pack("H*",$matches[1]),"UTF-8","UCS-2BE");'
),
$str);
}