Home > Listati di programmi C > Leggere file XML

LEGGERE FILE XML, IDENTIFICARE LA GERARCHIA DEGLI ELEMENTI E RAPPRESENTARLA CON APPOSITA STRUTTURA DATI

Questo programma, con le relative funzioni, puo' costituire la base di partenza per la creazione di un parser di file XML. Attualmente (Dicembre 2017) sto rivedendo il codice per eliminare le variabili globali e apportare altri miglioramenti.

Ogni elemento XML e' rappresentato con una struct contenente il nome dell'elemento, il nome dell'elemento padre, l'indice dell'elemento padre, il numero di figli e un puntatore a interi per allocare dinamicamente gli indici degli elementi figli; le struct elemento sono collocate nell'array v_elementi[] a partire dal secondo posto (con indice 1) e ogni elemento e' identificato tramite il suo indice nell'array. Non e' possibile inserire piu' di una volta i dati dello stesso elemento. La dimensione di v_elementi[] e' definita nel file header xml_lib.h con #define DIM_V_ELEMENTI 1000.

Il programma opera in sei fasi:

1) legge un file XML indicato dall'utente, verificando che le parentesi angolari siano disposte regolarmente, secondo questa regola: la prima parentesi deve essere di apertura, ad ogni parentesi di apertura deve seguirne una di chiusura e viceversa, non sono ammesse apertura e chiusura consecutive <>, l'ultima parentesi deve essere di chiusura; se trova un errore si ferma, indicando la posizione del carattere che ha prodotto l'errore;

2) rilegge il file, collocando in una lista concatenata i tag di apertura/chiusura; non vengono messi in lista i tag che non servono, per la determinazione della gerarchia degli elementi: dichiarazione XML, commenti, link alla grammatica, ecc.; i tag che rappresentano un elemento vuoto vengono divisi in due tag (apertura e chiusura);

3) verifica se ci sono errori nel bilanciamento e nell'annidamento dei tag; l'algoritmo usato funziona cosi': legge un tag dalla lista; se il tag e' di apertura elimina le parentesi angolari (lasciando solo il nome dell'elemento) e inserisce la stringa ottenuta in una pila di stringhe; se il tag e' di chiusura elimina parentesi angolari e barra, poi legge l'ultimo elemento messo in pila e lo confronta con quello letto dalla lista; se i nomi dei due elementi sono uguali toglie dalla pila l'ultimo elemento inserito e prosegue, se sono diversi si ferma e segnala l'errore, mostrando l'elemento letto dalla lista e quello letto dalla pila;

4) legge dalla lista dei tag gruppi di tre tag consecutivi alla volta e si ferma quando trova una tripla di tag utile per ricostruire i rapporti di gerarchia; infatti, una tripla di tipo apertura-apertura-chiusura fa capire al programma che il secondo tag si riferisce a un elemento figlio rispetto a quello identificato dal primo tag di apertura e che questo figlio (identificato da secondo e terzo tag) dopo essere stato aperto viene subito chiuso (cosi' si individua almeno una coppia apertura-chiusura da eliminare); quando trova una tripla di questo tipo inserisce in v_elementi[] una struct contenente il nome dell'elemento figlio e quello dell'elemento padre, poi elimina dalla lista dei tag tutte le coppie apertura-chiusura consecutive dell'elemento figlio; il processo viene iterato fino allo svuotamento della lista;

5) legge i dati inseriti nelle struct elemento in v_elementi[] e, per ogni elemento, aggiunge i dati relativi a indice dell'elemento padre, numero di figli e indici degli elementi figli;

6) visualizza i dati memorizzati nelle struct di v_elementi[].

Per adesso, non ho trattato il caso di tag di apertura contenenti, oltre al nome dell'elemento, altre stringhe (valori, attributi, ecc.); processare un file XML siffatto blocca l'elaborazione per errore di bilanciamento o annidamento. Non ho previsto nemmeno il controllo sulla presenza di caratteri vietati nel nome di un elemento e la gestione delle entita' (predefinite e non). E non viene fatta la validazione, cioe' il controllo semantico di conformita' del file XML a una grammatica (definita nel file stesso o in un file esterno DTD.

File xml_lib.h

File xml_lib.c

Programma leggi_xml.c


Home


www.corradodamiano.it a cura di Corrado Damiano

posta@corradodamiano.it