Отправить заявку

Небольшой PHP-class парсинга XML в массив

Все знают про монстров разбора xml файлов SimpleXML и DOM . Но не всегда есть возможность ими воспользоваться. Для этого возьмем небольшой и продуктивный php класс для разбора xml структуры в массив данных.

<?php 
/** 
*    @class    xml2array 
*/ 

class    xml2array 
{ 

    /** 
    *    constructor 
    */ 
    function xml2array( $xml ) 
    { 
        // check for file 
        if ( file_exists($xml) ) 
            $xml = file_get_contents( $xml ); 

        // check for string, open in dom 
        if ( is_string($xml) ) 
        { 
            $xml = domxml_open_mem( $xml ); 
            $this->root_element = $xml->document_element(); 
        } 

        // check for dom-creation,  
        if ( is_object( $xml ) && $xml->node_type() == XML_DOCUMENT_NODE ) 
        { 
            $this->root_element = $xml->document_element(); 
            //$this->xml_string = $xml->dump_mem(true); 
            return TRUE; 
        } 

        if ( is_object( $xml ) && $xml->node_type() == XML_ELEMENT_NODE ) 
        { 
            $this->root_element = $xml; 
            return TRUE; 
        } 

        return FALSE; 
    } 

    /** 
    *    recursive function to walk through dom and create array 
    */ 
    function _recNode2Array( $domnode ) 
    { 
        if ( $domnode->node_type() == XML_ELEMENT_NODE ) 
        { 

            $childs = $domnode->child_nodes(); 
            foreach($childs as $child) 
            { 
                if ($child->node_type() == XML_ELEMENT_NODE) 
                { 
                    $subnode = false; 
                    $prefix = ( $child->prefix() ) ? $child->prefix().':' : ''; 
                     
                    // try to check for multisubnodes 
                    foreach ($childs as $testnode) 
                      if ( is_object($testnode) ) 
                        if ($child->node_name() === $testnode->node_name() && $child != $testnode) 
                            $subnode = true; 
                             
                    if ( is_array($result[ $prefix.$child->node_name() ]) ) 
                        $subnode = true; 

                    if ($subnode == true) 
                        $result[ $prefix.$child->node_name() ][]    = $this->_recNode2Array($child); 
                    else 
                        $result[ $prefix.$child->node_name() ]    = $this->_recNode2Array($child); 
                } 
            } 
     
            if ( !is_array($result) ){ 
                // correct encoding from utf-8 to locale 
                // NEEDS to be updated to correct in both ways! 
                $result['#text']    =    html_entity_decode(htmlentities($domnode->get_content(), ENT_COMPAT, 'UTF-8'), ENT_COMPAT,'ISO-8859-15'); 
            } 
     
            if ( $domnode->has_attributes() ) 
                foreach ( $domnode->attributes() as $attrib ) 
                { 
                    $prefix = ( $attrib->prefix() ) ? $attrib->prefix().':' : ''; 
                    $result["@".$prefix.$attrib->name()]    =    $attrib->value(); 
                } 

            return $result; 
        } 
    } 

    /** 
    *    caller func to get an array out of dom 
    */ 
    function getResult() 
    { 
        if ( $resultDomNode = $this->root_element ) 
        { 
            $array_result[ $resultDomNode->tagname() ] = $this->_recNode2Array( $resultDomNode ); 
            return $array_result; 
        } else  
            return false; 
    } 
     
    function getEncoding() 
    { 
        preg_match("~\<\?xml.*encoding=[\"\'](.*)[\"\'].*\?\>~i",$this->xml_string,$matches); 
        return ($matches[1])?$matches[1]:""; 
    } 
     
    function getNamespaces() 
    { 
        preg_match_all("~[[:space:]]xmlns:([[:alnum:]]*)=[\"\'](.*?)[\"\']~i",$this->xml_string,$matches,PREG_SET_ORDER); 
        foreach( $matches as $match ) 
            $result[ $match[1] ] = $match[2]; 
        return $result; 
    } 
} 
?>
Другие публикации