PHP SimpleXML 对有CDATA的xml解析问题

<?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;
 
}
 
?>

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

使用新浪微博登陆