[PHP] [VK API] XML Parser

Discussion in 'PHP' started by |qbz|, 16 Mar 2011.

  1. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Попросили недавно написать парсер XML для вконтактовской апи, да и вообще любых XML.

    Возвращает массив типа
    Code:
    $parsed_xml['xml_0']['response_0']['post_0']['text_0']
    Вызывать так:
    Code:
    $parsed_xml = pall(str_replace('?xml','xml',$xml));
    где - $xml это ответ VK api.

    Может сгодится кому:
    PHP:
    <?php
        
    function parseTag($xml)
        {
            
    $i 0;
            
    $x false;
            
    $tag '';
            
    $filter str_split('1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM_',1);
            for (
    $i 0$i strlen($xml); $i++)
            {
                if (
    $x)
                {
                    if (
    in_array(substr($xml,$i,1),$filter))
                    {
                        
    $tag .= substr($xml,$i,1);
                    }
                    else
                    {
                        break;
                    }
                }
            
                if (
    substr($xml,$i,1) == '<')
                {
                    
    $x true;
                }
            }
            return 
    $tag;
        }
        
        function 
    giveXmlContentByTag($xml,$tags)
        {
            
    $tag parseTag($xml);
            
            if (
    $tag == '')
            {
                return 
    $xml;
            }
            else
            {
                
    $xmlcontent explode('<'.$tag,$xml);
                
    $xmlcontent explode('</'.$tag,$xmlcontent[1]);
                if (
    strstr($xmlcontent[0],'<'))
                {
                    
    $xmlcontent explode('<',$xmlcontent[0]);
                    unset(
    $xmlcontent[0]);
                    
    $xmlcontent '<' implode('<',$xmlcontent);
                }
                else
                {
                    
    $xmlcontent explode('>',$xmlcontent[0]);
                    
    $xmlcontent $xmlcontent[count($xmlcontent)-1];
                }
                
    $i 0;
                while(
    true)
                {
                    if (
    $tags[$tag.'_'.$i] == '')
                    {
                        
    $tags[$tag.'_'.$i] = $xmlcontent; break;
                    }
                    else
                    {
                        
    $i += 1;
                    }
                }
                
                
    $rest explode('</'.$tag,$xml); unset($rest[0]);
                
    $rest implode('</'.$tag,$rest);
                
    $rest explode('<',$rest); unset($rest[0]);
                
    $rest '<' trim(implode('<',$rest));

                if (
    trim($rest) != '<')
                {
                    return(
    giveXmlContentByTag($rest,$tags));
                }
                else
                {
                    return(
    $tags);
                }
            }
        }
        
        function 
    pall($xml)
        {
            
    $parsed giveXmlContentByTag($xml,array());
            foreach (
    $parsed as $pk => $pv)
            {
                if (
    strstr($pv,'<'))
                {
                    @
    $parsed[$pk] = pall($pv,array());
                }
                else
                {
                    
    $parsed[$pk] = $pv;
                }
            }
            return (
    $parsed);
        }
        
        
    $parsed_array pall(str_replace('?xml','xml',$xml));
    ?>
    Вот нормальный код, неперефигаченный булкой.
     
    #1 |qbz|, 16 Mar 2011
    Last edited: 16 Mar 2011
    1 person likes this.
  2. Radish

    Radish New Member

    Joined:
    9 Jan 2011
    Messages:
    20
    Likes Received:
    2
    Reputations:
    2
    http://ua2.php.net/manual/en/book.xml.php
    Не подходит?
     
  3. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    да подходит, подходит, писал ради интереса скорее )
    кстати на моей практике были фрихосты, на которых небыло иксмээл либ
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    |qbz| вот только теряются все аттрибуты тегов, что не есть хорошо
     
    _________________________
  5. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    ну я писал это дело исходя из ХМЛ-ответа ВК АПИ, там никаких аттрибутов нет, хотя так то я в курсе, что это не совсем корректно
     
  6. winter_silence

    winter_silence New Member

    Joined:
    22 Nov 2008
    Messages:
    21
    Likes Received:
    4
    Reputations:
    0
    Хороший парсер, спасибо :)
     
  7. Alexander89

    Alexander89 Member

    Joined:
    30 Nov 2009
    Messages:
    30
    Likes Received:
    8
    Reputations:
    0
    Для VK логичнее и проще использовать
    PHP:
    json_decode()