Небольшой 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;
    }
}
?>
Возврат % от покупок

Другие публикации:



Написать комментарий через:

 
               
  • Локальный блог
  •  
 

Ваш отзыв

Имя *

Почта (скрыта) *

Сайт

Напишите цифрами двa вoceмь двa *

Сообщение

 
Статусы для соц.сетей на ArtKiev Design Studio