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
|