`
dlcoco9999
  • 浏览: 37799 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

xmltojson中遇到的CDATA变空以及json_encode成unicode的解决方法

    博客分类:
  • php
阅读更多
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('>','&gt;',
                                    str_replace('>','&lt;',
                                    str_replace('"','&quot;',
                                    str_replace('&','&amp;',
                                    $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);
}
分享到:
评论
1 楼 ngxiaoyi 2013-09-22  
 $new_xml .= str_replace('>','&gt;', 
                                    str_replace('>','&lt;', 
                                    str_replace('"','&quot;', 
                                    str_replace('&','&amp;', 
                                    $cdata)))); 


最后的应为'<'转为'&lt;'

相关推荐

    asp.net自带类读写xml中的CDATA

    ASP.NET 3.5及以上版本提供了内置的序列化类,使得操作XML中的CDATA变得简单,同时也支持JSON数据格式的读写。 本文将详细介绍如何利用ASP.NET的内置类来读写XML中的CDATA,以及如何将这些数据转换为JSON格式。 ##...

    包含CDATA的 字符串转换成xml

    本文档包含了一个完整的实例,可以实现含有CDATA 的字符串转换成xml

    JAVA对象转换成XML(CDATA)

    在Java编程中,将对象转换成XML是一种常见的数据序列化方式,这有助于数据交换和存储。当遇到包含特殊字符如 "和 "&" 的文本时...这种方式允许我们在XML中安全地包含任何类型的数据,而不会因为特殊字符导致解析错误。

    XML:标签CDATA用法

    ### XML中的CDATA用法详解 #### 一、CDATA的基本概念 **CDATA**(Character Data)是一种特殊的文本区域,它被XML解析器视为纯文本数据,并不会对其进行解析或处理。这意味着在CDATA段落内的任何XML标签或者实体引用...

    android SaxParser 解析 CDATA

    在这个过程中,`CDataContentHandler`的`characters`方法会被调用,每次接收到XML文档的字符数据,当遇到CDATA段时,`isCDATASection`方法会识别并把内容添加到`cdataBuffer`。 4. 最后,你可以从`...

    C#读取XML的CDATA节点内容实例详解

    在本篇文章中,我们将详细介绍如何使用C#语言读取XML文件中的CDATA节点内容。CDATA节点是一种特殊的XML节点,用于存储不需要被XML解析器解析的文本数据。在实际开发中,我们经常需要读取CDATA节点中的数据,以便进行...

    php生成xml时添加CDATA标签的方法

    在使用PHP生成XML文件时,有时会遇到需要将特殊字符或大量文本添加到元素中的情况。为了保证XML的格式正确,避免解析错误,我们需要将这部分内容用CDATA标签包裹起来。CDATA部分会告诉XML解析器忽略内部文本中的特殊...

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    CDATA(Character Data)是XML中的一种特殊语法,用于表示一段纯文本,其中的XML特殊字符(如", "&gt;", "&")不需要转义。在XML中,可以使用`&lt;![CDATA[ ... ]]&gt;`来创建CDATA段。当处理包含大量特殊字符的数据时,使用...

    如何处理xml中的CDATA脚本

    本文将详细探讨如何在C#环境中处理XML中的CDATA脚本。 首先,理解CDATA的语法是至关重要的。CDATA区段通常以`&lt;![CDATA[`开始,以`]]&gt;`结束,其中间的任何字符都不会被XML解析器解析为XML元素或实体。例如: ```xml...

    CData.rar_cdata

    这个文本文件可能提供了相关的链接,学习者可以通过这些链接获取更多的实践练习、实例代码或者解决编程问题的方法。 在学习C语言的过程中,理解并熟练运用指针是至关重要的。C语言中的指针允许直接访问内存地址,...

    PHP 将XML转成数组(微信回调接收方法).rar

    $array = json_decode(json_encode((array)$xmlObject), true); ``` 3. **处理嵌套元素**: 如果XML包含嵌套元素,它们将以多维数组的形式出现。例如,如果有 `&lt;items&gt;` 标签包含多个 `&lt;item&gt;` 子标签,数组将会...

    xml 转json资源包

    在实际应用中,可能存在一些挑战,如处理命名空间、处理XML的特性(如CDATA、注释等)以及处理非标准的XML结构。这个jar包可能已经解决了这些问题,提供了方便易用的接口。 使用这个“xml转json”资源包,开发人员...

    区分CDATA和PCDATA

    总之,CDATA和PCDATA是XML中处理文本内容的两种不同方式。CDATA提供了一种机制,可以在不进行特殊字符转义的情况下直接插入文本,特别适用于含有大量特殊字符的情况;而PCDATA则需要对文本中的特殊字符进行转义,...

    Flex与JSON及XML的互操作

    ### Flex与JSON及XML的互操作 Flex作为一种强大的开源框架,允许开发者利用MXML(一种基于标签的语言)和ActionScript 3构建出丰富的互联网应用程序(RIA)。本文将深入探讨Flex如何与JSON和XML进行互操作,这对于...

    5、CDATA 和转义字符1

    在XML文档中,为了保证文档的结构正确性和语义...在这个例子中,使用CDATA块包裹比较运算符,防止XML解析器将其解释为元素或实体,确保了SQL查询的正确性。同时,由于SQL查询通常较长,使用CDATA块提高了代码的可读性。

    .NET更新Xml中CDATA内容的方法实例

    假如 Xml 文件的内容如下: 1.XML 代码 代码如下:&lt;?xml version=”1.0″ encoding=”utf-8″?&gt; &lt;sitename&gt;&lt;![CDATA[&lt;h2&gt;.NET 开发]]&gt; &lt;siteurl&gt;//www.jb51.net&lt;/siteurl&gt;&lt;/net&gt;我们可以采用下面的方法...

    php使用simplexml_load_file加载XML文件并显示XML的方法

    这个函数允许我们轻松地加载XML文件,并将其转换为一个SimpleXMLElement对象,该对象提供了访问XML结构的便利方法。下面我们将详细探讨如何使用`simplexml_load_file`以及它的一些基本用法。 首先,`simplexml_load...

    as3corelib.swc及解析json的例子

    在这个例子中,`parseJSON()`函数展示了如何使用`JSON.decode()`方法将JSON字符串转换为ActionScript对象。一旦解析完成,你可以像操作普通AS3对象一样访问JSON数据的属性。 除了基本的解析,as3corelib还提供了...

    cdata:将Lua表序列化为C结构和字符串

    local cdata = require " cdata " local packets = {} -- all structs get a type field so we don't lose our minds. function add_struct ( name , fields , map ) local struct = string.format ( " typedef ...

Global site tag (gtag.js) - Google Analytics