Попросили недавно написать парсер 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)); ?> Вот нормальный код, неперефигаченный булкой.
да подходит, подходит, писал ради интереса скорее ) кстати на моей практике были фрихосты, на которых небыло иксмээл либ
ну я писал это дело исходя из ХМЛ-ответа ВК АПИ, там никаких аттрибутов нет, хотя так то я в курсе, что это не совсем корректно