IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PHP SimpleXML 对有CDATA的xml解析问题

    usity发表于 2016-08-29 02:30:22
    love 0

    <?php
    $xml_data = file_get_contents('a.xml');
    $simplexml = simplexml_load_string($xml_data);
    print_r($simplexml);
    ?>

     结果
    SimpleXMLElement Object
    (
        [show] => Array
            (
                [0] =>SimpleXMLElement Object
                   (
                       [name] => The Simpsons
                   )
                [1]=> SimpleXMLElement Object
                   (
                       [name] => That '70s Show
                   )
                [2]=> SimpleXMLElement Object
                   (
                       [name] => Family Guy
                   )
                [3]=> SimpleXMLElement Object
                   (
                       [name] => SimpleXMLElement Object
                           (
                           )
                   )
            )
    )

    更新完善后的:
    <?php
    $xml_data = file_get_contents('a.xml');
     
    $xml_data = uncdata($xml_data);
    $simplexml = simplexml_load_string($xml_data);
     
     
    print_r($simplexml);
     
     
     
    function uncdata($xml)
    {
        // States:
        //
        //     'out'
        //     '<'
        //     '<!'
        //     '<!['
        //     '<![C'
        //     '<![CD'
        //     '<![CDAT'
        //     '<![CDATA'
        //     'in'
        //     ']'
        //     ']]'
        //
        // (Yes, thestates a represented by strings.)
        //
     
        $state = 'out';
     
        $a =str_split($xml);
     
        $new_xml = '';
     
        foreach ($a AS$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('>','&gt;',
                                   str_replace('>','&lt;',
                                   str_replace('"','&quot;',
                                   str_replace('&','&amp;',
                                    $cdata))));
                       $state = 'out';
                    } else {
                       $cdata .= $state . $v;
                       $state = 'in';
                    }
                break;
            } // switch
     
        }
            return$new_xml;
     
    }
     
    ?>



沪ICP备19023445号-2号
友情链接