14. Elaborazione di documenti XML
![]() |
Si consideri il seguente documento XML:
<tribu>
<enseignant>
<personne sexe="M">
<nom>dupont</nom>
<prenom>jean</prenom>
<age>28</age>
ceci est un commentaire
</personne>
<section>27</section>
</enseignant>
<etudiant>
<personne sexe="F">
<nom>martin</nom>
<prenom>charline</prenom>
<age>22</age>
</personne>
<formation>dess IAIE</formation>
</etudiant>
</tribu>
Analizziamo questo documento per ottenere il seguente output della console:
tribu
enseignant
(personne,(sexe,M) )
nom
[dupont]
/nom
prenom
[jean]
/prenom
age
[28]
/age
/personne
section
[27]
/section
/enseignant
etudiant
(personne,(sexe,F) )
nom
[martin]
/nom
prenom
[charline]
/prenom
age
[22]
/age
/personne
formation
[dess IAIE]
/formation
/etudiant
/tribu
Dobbiamo sapere come riconoscere:
- un tag di apertura come <training>;
- un tag di chiusura come </teacher>;
- un tag di apertura con attributi come <person gender="F">;
- il corpo di un tag, come "martin" in <name>martin</name>.
Un programma che analizza il codice XML è chiamato parser XML. Due moduli forniscono le funzionalità necessarie per analizzare il codice XML: xml.sax e xml.sax.handler.
Il modulo [xml.sax] ci fornisce un parser XML utilizzando la seguente istruzione:
Questo parser analizza il testo XML in modo sequenziale. Chiama metodi definiti dall'utente in occasione di eventi:
- il metodo startElement su un tag di apertura;
- il metodo endElement su un tag di chiusura;
- il metodo characters sul corpo di un tag.
Dobbiamo indicare al parser quale classe implementa questi metodi:
Passiamo un'istanza di una classe che implementa i metodi startElement, endElement e characters al metodo setContentHandler del parser. La classe utilizzata è una sottoclasse della classe xml.sax.handler.ContentHandler. I metodi precedenti vengono chiamati con i seguenti parametri:
- name è il nome del tag di inizio. attributes è il dizionario degli attributi del tag. Pertanto, per il tag <person sex="M">, avremo name="person" e attributes={'sex':'M'}
- name è il nome del tag di chiusura. Quindi, per il tag </student>, avremo name='student'.
- data è il corpo del tag. Quindi, se il tag è
avremo data='\r\n dupont\r\n '. In genere, rimuoviamo gli spazi bianchi che precedono e seguono i dati.
Ora che questo è stato spiegato, possiamo passare allo script per l'analisi di un documento XML:
Note:
- Lo script utilizza la libreria di funzioni dei moduli xml.sax e xml.sax.handler (riga 3);
- riga 62: il file XML analizzato;
- riga 68: il parser XML;
- Riga 70: il gestore degli eventi emessi dal parser sarà un'istanza della classe XmlHandler;
- riga 72: inizia l'analisi del documento XML;
- riga 6: la classe che implementa i metodi startElement, endElement e characters. Deriva dalla classe xml.sax.handler.ContentHandler, che implementa i metodi utilizzati dal parser;
- riga 9: il metodo startElement;
- riga 30: il metodo endElement;
- riga 41: il metodo characters.
I risultati sono quelli presentati all'inizio di questo paragrafo.
