Scrivere un Parser XML con PHP

In un linguaggio potente come il PHP non poteva di certo mancare il supporto per l'XML, ci sono infatti molte funzioni a disposizione dello sviluppatore per creare abbastanza facilmente dei parser XML.

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.

Giampaolo Rossi
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Articoli: 325

Un commento

  1. 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.

I commenti sono chiusi.

RGPSoft© 2026 - Contenuti distribuiti con licenza CC BY 4.0