PHP/MySQL Freelance
mobile: +39 3489215204
Mi è capitato di provare entrambe, SAX e DOM, per fare il parsing di un file XML, la differenza in termini di tempo è ampissima, sono passato da 4 ore di esecuzione a 9 secondi in media.
La differenza tra le interfacce porta ad una differente complessità di codice, ma tutto dipende dal punto di vista
Non si capisce cosa sia Document Object Model se non si capisce cosa sia una XPath: semplicemente XPath è un percorso che permette di fare il match di uno o più elementi all'interno di un documento xml.
Esempio: //product[@title="casa"]
Fa il match di tutti gli elementi product con attributo title="casa"
Ogni linguaggio di programmazione, ogni libreria mette a disposizioni diversi modi per usare xpath, ma sostanzialmente consiste nel fare una richiesta di una lista di nodi con match ad una XPath. Tipicamente si utilizza questa lista di nodi all'interno di un ciclo dove si va ad utilizzare il contenuto del nodo.
Per esempio, se <product> ha elementi figli o altri attributi, si vuole un determinato figlio, magari identificato tramite un altro XPath.
(Simple API for XML). Esiste un parser XML discendente ricorsivo fornito dalla libreria, tale parser accetta come parametri di inizializzazione 3 o più funzioni di callback, che il parser chiama al verificarsi di un determinato evento, con opportuni parametri dipendenti dal contesto.
Le 3 funzioni callback base sono: inizio di un elemento, fine di un elemento, character data.
(ci saranno callback definibili per CDATA start, CDATA end, e tutto quello che può succedere, se la libreria è completa)
Alla callback inizio elemento viene passato come minimo il nome dell'elemento, e la lista dei suo attributi, alla funzione fine elemento verra passato il nome dell'elemento, ed a quella character viene passata una lista di caratteri. (bisogna naturalmente far riferimento alla documentazione specifica)
Dal punto di vista della programmazione si hanno 2 differenti prospettive. Con DOM si considera il documento come un oggetto a tutti gli effetti, e vengono fatte le richieste tramite i metodi, ad esempio XPath. Con SAX il documento viene letto e interpretato per registrare o usare le informazioni.
In pratica se ciò che centrale nella problematica sono i dati contenuti nel documento (e tutti), allora sono portato ad usare SAX, mentre se ciò che è centrale è estrarre determinati dati da un documento allora sono portato ad usare DOM.
Se devo usare l'interfaccia DOM, è conveniente caricare il file in memoria (se non lo è già, come nel caso del javascript per la manipolazione di un HTML). Questo perchè l'accesso al disco sarebbe sicuramente sconveniente.
Altra cosa, però banale, fare in modo di non chiamare metodi più volte per una informazione che potrebbe essere stata già fornita, cioè fare meno richieste possibili all'oggetto documento.
Anche caricando il documento in memoria le performance possono essere non molto buone, consideriamo ad esempio un documento di 2 Mbytes (e non deve necessariamente essere enorme, considerato che può essere codificato in UTF). Ad ogni richiesta di un XPath sul nodo principale il parser legge tutto il documento per cercare i nodi corrispondenti e crea una struttura dove mettere il risultato della richiesta. Se facciamo 200 richieste e abbiamo abbiamo 2 milioni di bytes il parser dovrà leggere 400 MBytes e processarli, in maniera anche piuttosto complessa (match di una XPath). Anche se il documento è mantenuto sempre in memoria e mai spostato nello swap, la quantità di operazioni è elevatissima.
Utilizzando SAX il documento viene letto una sola volta, non fa molta differenza il caricarlo in memoria, visto che è un parser discendente ricorsivo. Tutte le informazioni dovranno essere registrate in una qualche struttura dati interna al programma. Una volta finito il parsing verranno usate tali dati, oppure tali dati vengono usati direttamente mentre viene fatto il parsing per poi non essere più necessari.
Sebbene DOM sembri più figo perchè è ad oggetti, nella pratica comune, anche se è più complesso (bisogna predisporre opportune strutture dati), SAX è sicuramente la scelta migliore per estrarre _tutte_ le informazioni da un documento XML.