PHP – Da XML ad array

Pubblicato il Scritto il da

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.