Ho avuto un periodo nella mia vita in cui parsare file XML in PHP era diventata un’ossessione (vedi “PHP – HTML Parser (text node compresi)“).
E con questo secondo appuntamento cambiamo metodo: non più DOM, ma XML Parser.
Vediamo il codice:
<?php $xml="<a:root> aaa <a1 ciao="bella"> <b1> ff </b1> </a1> <a2> bb </a2> </a:root>"; $struct = array(); $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "data"); $parse = xml_parse($xml_parser,$xml); xml_parser_free($xml_parser); print("<pre>n"); print_r($struct); print("</pre>n"); function startElement($parser, $name, $attrs) { global $struct; $tag = array("name"=>$name, "attributes"=>$attrs); array_push($struct,$tag); } function data($parser, $data) { global $struct,$i; if(trim($data)) { $struct[count($struct)-1]['data']=trim($data); } } function endElement($parser, $name) { global $struct; $struct[count($struct)-2]['child'][] = $struct[count($struct)-1]; array_pop($struct); } ?>
Scusate, per l’ennesima volta, la ruzzezza del codice (“ma non avuto il tempo di farlo in scala e di dipingerlo” [cit] )
L’output risultate è il seguente:
Array ( [0] => Array ( [name] => A:ROOT [attributes] => Array ( ) [data] => aaa [child] => Array ( [0] => Array ( [name] => A1 [attributes] => Array ( [CIAO] => bella ) [child] => Array ( [0] => Array ( [name] => B1 [attributes] => Array ( ) [data] => ff ) ) ) [1] => Array ( [name] => A2 [attributes] => Array ( ) [data] => bb ) ) ) )
Sarebbe interessante effettuare dei benchmark.
Buon parse! 😉
Fonte: link.