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.