function xml_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
return decodeUnicode($json);
}
//处理CDATA
function uncdata($xml)
{
// States:
//
// 'out'
// '<'
// '<!'
// '<!['
// '<![C'
// '<![CD'
// '<![CDAT'
// '<![CDATA'
// 'in'
// ']'
// ']]'
//
// (Yes, the states a represented by strings.)
//
$state = 'out';
$a = str_split($xml);
$new_xml = '';
foreach ($a AS $k => $v) {
// Deal with "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
function decodeUnicode($str)
{
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
create_function(
'$matches',
'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
),
$str);
}
分享到:
相关推荐
本文档包含了一个完整的实例,可以实现含有CDATA 的字符串转换成xml
asp.net3.5及以上版本自带序列化类读写XML中的cdata数据(JSON数据格式),看代码就明白。
XML 元素中,"和 "&" 是非法的。"会产生错误,因为解析器会把该字符解释为新元素的开始。"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。CDATA:在标记CDATA下,所有的标记、实体引用都被忽略,而被XML...
XML:标签CDATA用法 XML:标签CDATA用法
假如 Xml 文件的内容如下: 1.XML 代码 代码如下:<?xml version=”1.0″ encoding=”utf-8″?> <sitename><![CDATA[<h2>.NET 开发]]> <siteurl>//www.jb51.net</siteurl></net>我们可以采用下面的方法...
主要介绍了php生成xml时添加CDATA标签的方法,实例讲述了php操作XML文件的技巧,非常具有实用价值,需要的朋友可以参考下
主要介绍了php使用simplexml_load_file加载XML文件并显示XML的方法,实例分析了simplexml_load_file操作XML文件的技巧,非常具有实用价值,需要的朋友可以参考下
H3CData高校大数据解决方案
在本篇文章里小编给大家整理了关于C# 读取XML的CDATA节点内容的相关知识点内容,有需要的朋友们参考学习下。
C资料大全,供各位学习C语言时参考之用。如发现有错误请即时与我联系。
android 使用saxparser 解析<![CDATA[ ]]>标签数据。 见附件实例
[CDATA[gh_33bb5907f91e]]></ToUserName> <FromUserName><![CDATA[ojLh3jkYtiszyEY-_sM_8yrNxSc4]]> <CreateTime>1363231643 <MsgType><![CDATA[text]]> <Content><![CDATA[天雷落卷九]]> <MsgId>...
易语言XML_Tree模块源码,XML_Tree模块,数据_取出,数据_导入,数据_释放,节点_取出,节点_删除,节点_替换,节点_插入,节点_数据_取实际名称,私有_CDATA替换并编号,私有_解析XML数据,私有_删空白字符,私有_存完备节点,...
验证XML,将XML解析为JS / JSON,反之亦然,或者快速将XML解析为Nimn,而无需基于C / C ++的库且没有回调 为了支付费用,我们计划并行发布版。 如有兴趣,请观看它以获取进一步的更新。 用户数 使用快速XML解析器的...
C语言初学者适用程序,适用于大学低年的学生学编程。
主要介绍了php操作xml入门之cdata区段,分析了CDATA的功能及用法,需要的朋友可以参考下
主要为大家介绍下XML CDATA是什么,学习xml的朋友可以参考下
超全面javaweb第4天-_10_xml的CDATA区