In alcuni articoli scorsi abbiamo affrontato il tema di XML, ancora dobbiamo concludere l’argomento parlando degli schemi, ma la sintassi base dello pseudo-linguaggio l’abbiamo già affrontata. Abbiamo trattato già dell’uso che ne fa il .NET attraverso i DataSet e l’utilizzo di SAX in Java ( per trovare i singoli articoli potete analizzare i post con tag XML ). In questo articolo affronteremo l’argomento del parsing XML attraverso un linguaggio potente nel quale certamente non poteva mancare un tale supporto, vedremo come creare un parser XML in PHP.
Il meccanismo del parsing di documenti XML avviene attraverso l’uso degli handler, ovvero di funzioni che vengono richiamate durante l’analisi del file. Vediamo un esempio pratico che ci possa far capire come funzioni il tutto. Scriviamo un documento XML delle nostre anagrafiche ed in particolare dei clienti:
<?xml version="1.0" ?> <anagrafica> <cliente idcliente="1"> <nome>Mario</nome> <cognome>Rossi</cognome> <web>http://www.test.com</web> </cliente> <cliente idcliente="2"> <nome>Vincenzo</nome> <cognome>Verdi</cognome> <web>http://www.prova.com</web> </cliente> </anagrafica>
Inseriamo questo semplice file XML che chiameremo “anagrafica.xml” nella stessa cartella del server dove risiede il file PHP che compie il parsing di questo documento:
<?php $file = "anagrafica.xml"; function startElement($parser, $name, $attrib) { echo "Apertura tab: $name<br>"; if (sizeof($attrib)) { echo "attributi:"; while (list($key, $val) = each($attrib)) echo "$key = $val"; echo "<br>"; } } function endElement($parser, $name) { echo "Chiusura del tag: $name<br>"; } function characterData($parser, $data) { if (trim($data) != "") echo "Valore: $data<br>"; } ?> <html> <head><title>Parsing XML in PHP</title></head> <body> <?php $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); if (!($f = @fopen($file, "r"))) die("Impossibile aprire il file per il parsing"); echo "<b>Inizio parsing</b><br>"; while ($data = fread($f, 4096)) { if (!xml_parse($xml_parser, $data, feof($f))) { die(sprintf("%s(%d): %s<br>", $file, xml_get_current_line_number($xml_parser), xml_error_string(xml_get_error_code($xml_parser)))); } echo "<b>Parsing completato!</b>"; xml_parser_free($xml_parser); } ?> </body> </html>
Il programma inizia con la definizione delle tre funzioni handler che vengono richiamate rispettivamente all’apertura dell’elemento, alla fine dell’elemento e durante la lettura del testo contenuto. Nella parte principale del programma viene creato un nuovo parser con la funzione xml_parser_create(), quindi vengono impostati i nomi degli handler: xml_set_element_handler() per le due funzioni di apertura e chiusura dell’elemento, mentre per la lettura del testo compreso tra gli elementi occorre impostare l’handler con xml_set_character_data_handler(). Esistono molti altri handler gestibili dal parser XML, come ad esempio la gestione delle processing instruction oppure le notation declaration, per le quali rimando alla documentazione di PHP ed XML. In questo articolo abbiamo cercato di fare, come in miei altri post, un esempio basilare per capire bene come funziona, poi sarete voi stessi a perfezionare e rendere più sofisticati questi esempi, il processo di parsing in una pagina PHP.
E’ possibile scrivere siti web completamente in formato xml usando speciali server come Cocoon per la gestione e la trasformazione delle pagine in html o altro formato.