martedì 22 maggio 2012

Parsing di XML: DOM, SAX, StAX

L'interfaccia di un componente può vincolare pesantemente le sue caratteristiche prestazionali e di usabilità. Un esempio abbastanza significativo è rappresentato dalle tre diverse API che sono state disegnate per il parsing dei documenti XML.

Per l'elaborazione dei documenti XML esistono infatti tre interfacce standard, ciascuna con particolari caratteristiche di prestazione e di usabilità.

fornisce una modalità di navigazione all'interno del documento XML di tipo "ad albero"; il parser, a partire dal documento XML, memorizzato come stream di byte, crea una struttura in memoria (appunto modello a oggetti del documento) che rappresenta il documento in tutti i suoi aspetti. Il programmatore può navigare la struttura ad albero ed accedere in modo diretto (anche usando XPath) ai suoi elementi e attributi.

contrariamente al parser DOM, il parser SAX elabora i documenti in una modalità "a eventi" (streaming parser) senza caricare in memoria l'interno documento. Il parser scorre il documento XML dall'inizio alla fine e, per ciascun elemento XML incontrato e che può essere significativo per l'elaborazione, produce un evento. L'evento è passato a una funzione di callback che il programmatore ha definito prima dell'attivazione del parser.  Questo tipo di parser è detto parser di tipo "push" in quanto gli eventi vengono inviati all'utilizzatore del parser senza che questo possa decidere quando ricevere il successivo evento.
L'elaborazione di documenti XML con un parser SAX richiede la creazione di uno specifico  automa a stati finiti (dipendente sia dalla struttura dell'XML sia dalla logica applicativa) ed è pertanto abbastanza laboriosa da implementare.
Gli unici vantaggi dei parser SAX sono: l'elevato livello di prestazioni e la ridotta quantità di memoria utilizzata, indipendentemente dalla dimensione del documento da elaborare.

è un parser di tipo "a eventi" (streaming parser) che quindi fornisce le prestazioni e la ridotta occupazione di memoria tipiche dei parser a eventi, ma che punta a offrire una maggiore comodità di programmazione.
Il parser, infatti, una volta invocato su un documento XML, resituisce al suo utilizzatore un "cursore" che rappresenta la posizione corrente nel documento XML durante l'elaborazione.
L'applicazione, quando vuole ottenere ed elaborare il successivo evento (che rappresenta un elemento XML, nodo o attributo presente nel documento), può pilotare il parser facendo avanzare il cursore.
Per questa particolare modalità di interazione con il client, il parser viene detto di tipo "pull"

In sintesi:
XML Parser API Feature Summary (adattata da Oracle)

Feature

StAX

SAX

DOM

API Type

Pull, streaming

Push, streaming

In memory tree

Ease of Use

High

High

Medium

XPath Capability

No

No

Yes

CPU and Memory Efficiency

Good

Good

Varies

Forward Only

Yes

Yes

No

Read XML

Yes

Yes

Yes

Write XML

Yes

No

Yes

Create, Read, Update, Delete

No

No

Yes

Nessun commento:

Posta un commento