Newsgroup: it.comp.java
Titolo: SAX: domanda

ciao a tutti, una semplice domanda:
poichè nel web sono disponibili (anche online) molti script di convalida di
documenti xml rispetto alle dtd, quale potrebbe essere l'utilità di imparare
il SAX per java? Da quello che so attraverso SAX è possibile solamente
analizzare un documento XML e verificarne la convalida rispetto ad una DTD,
ma non è possibile modificare la sua struttura.
MI chiedo quindi: se a partire da un documento XML voglio crearne un altro
ottenuto dalla sostituzione di alcuni alementi del primo, il SAX può
servirmi a qualcosa o devo ricorrere necessariamente a DOM?
Nelle pagine del tutorial SAX della sun non ci sono esempi di applicazioni
pratiche del SAX, mentre per il DOM c'è l'esempio di un jtree realizzato con
swing.
grazie per le eventuali risposte!
--------------------------------
Inviato via 
http://usenet.libero.it

se usi il j2sdk 1.4 vedrai che al suo interno c'č gia tutto quello che serve
per trattare l'xml, quindi mi sa che in un prossimo futuro, il trattamento
dei tyracciati si faranno con quelle classi, quindi se devi impratichirti,
io iserei quelle incluse nello standard 1.4
Ciao
Sergio

 servirmi a qualcosa o devo ricorrere necessariamente a DOM?
Dipende da come vuoi usare le informazioni contenute nel documento XML. 
Se devi sostituire alcuni elementi e mantenere una struttura 
consultabile in memoria, è necessario l'utilizzo del DOM. Se vuoi solo 
processare il documento per ottenerne un'altro in cui alcuni elementi 
siano cambiati puoi utilizzare SAX. Quando esamini un nodo che vuoi 
cambiare stampi in output il nuovo elemento. Quando esamini un nodo che 
vuoi lasciare inalterato stampi il nodo stesso.
Per emettere in output XML con una specifica codifica può essere utile 
xmlenc:
http://xmlenc.sourceforge.net/
Gaetano Bigliardi

-gringo scrisse:
| ciao a tutti, una semplice domanda:
| poichè nel web sono disponibili (anche online) molti script di
| convalida di documenti xml rispetto alle dtd, quale potrebbe essere
| l'utilità di imparare il SAX per java?
SAX ti permette di scrivere ottimi parser che funzionano tramite la
generazione di eventi,
ovvero ogni volta che incontra un elemento ("TAG") dell'XML che stai
parsando verra' invocato un metodo della sua interfaccia da te da te
ridefinito in cui deciderai cosa fare.
(interrompere il parsing, stampare a video le informazioni, costruire un
oggetto grafico con i dati che stai collezionando etc etc...)
| Da quello che so attraverso
| SAX è possibile solamente analizzare un documento XML e verificarne
| la convalida rispetto ad una DTD, ma non è possibile modificare la
| sua struttura.
Non e' assolutamente vero
.....cosa intendi poi per "modificare la sua struttura."
| MI chiedo quindi: se a partire da un documento XML voglio crearne un
| altro ottenuto dalla sostituzione di alcuni alementi del primo, il
| SAX può servirmi a qualcosa o devo ricorrere necessariamente a DOM?
Certo che puo' servirti: mentre fai il parsing potresti ricopiare "le cose"
che incontri in un nuovo file (usando un XMLWriter
http://www.saxproject.org
) e quando ti arriva l'evento scatenato dal
riconoscimento di un elemento da sostituire lo sostituisci nel nuovo file e
continui cosi'...
| Nelle pagine del tutorial SAX della sun non ci sono esempi di
| applicazioni pratiche del SAX, mentre per il DOM c'è l'esempio di un
| jtree realizzato con swing.
Mah...cmq come gia' ti anno suggerito molte funzionalita' di parsing XML
(anche sax) sono incluse nativamente nella 1.4 quindi non credo ci siano
troppe difficolt'a a trovare esempi
Nota: la dfferenza tra DOM e SAX e' sostanzialmente a livello implementativo
ovvero
DOM costruisce in memoria una rappresentazione gerarchica del file (TUTTO il
file) che dopo puoi andare a manipolare
SAX genera eventi in corrispondenza dgli elementi del file e quando ne
incontri uno di tuo interesse puoi fare le tue operazioni
DOM Vantaggi : una volta eseguito il parsing hai una struttura +tosto
"malleabile" su cui operare
DOM Svantaggi : per file di grosse dimensioni puoi avere un bel po' di
memoria impegnata!
SAX vantaggi : non costruendo strutture in memoria l'occupazione e' costante
ed inoltre ti da la possibilita' di operare mentre stai parsando senza dover
aspettare la fine dell'operazione.
SAX svantaggi : se non ti interessa la velocita' e l'occupazione di memoria,
forse e' un po' + scomodo, e poi la struttura in memoria te la devi
costruire tu (SE ti serve!)
Ma in definitiva ci puoi fare le stesse cose.
| grazie per le eventuali risposte!
prego
--
^I^caro

 DTD, ma non è possibile modificare la sua struttura.
No: SAX e' un parser che genera eventi. Cose tipo "inizio documento", 
"inizio elemento", "caratteri" etc. Se vuoi, puoi vederlo come un 
trasformatore, da XML come testo a equivalente lista di eventi. Ora, e' 
chiaro che se questi eventi li memorizzi da qualche parte, per esempio una 
lista, "modificare la struttura" significa aggiungere o togliere eventi. 
Successivamente, puoi ricostruire l'XML percorrendo la lista di eventi e 
costruendo il corrispondente testo.
Idem con DOM - in cui la trasformazione e' da testo a set di oggetti che 
implementano org.w3c.dom.*; l'unica differenza e' che in DOM gli oggetti 
stessi forniscono metodi per aggiungere o togliere altri oggetti DOM; 
mentre una lista di eventi va manipolata attraverso i metodi 
(tipo add/insert/remove,etc) dell'oggetto che implementa la lista stessa. 
DOM e' quindi un filo piu' intuitivo.
Quasi tutti i parser SAX e DOM possono o meno validare l'XML sorgente su un 
DTD o un XSchema.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun


ti ringrazio, ora gli do un'occhiata
grazie per le info



ma in questo modo devo creare un albero a partire da una lista, il che può
essere complesso. L' XMLWriter a cui fai riferimento, consente di creare un
albero a partire da un altro albero direttamente?
grazie delle info


 (tipo add/insert/remove,etc) dell'oggetto che implementa la lista stessa.
è il problema a cui facevo riferimento: passare da un albero ad una lista e
poi da quest'ultima ad un nuovo albero è cosa spesso assai laboriosa. Per
questo credo che i tutorial non facciano esempi di manipolazioni di alberi
xml con sax. Sbaglio?



sai dove posso trovare qualche guida di riferimento, in rete, per queste
nuove classi? Il tutorial Java Web Services della sun fa ancora riferimento
al vecchio sistema...
ciao e grazie


 documento?
Per eseguire questo tipo di trasformazioni č indicato usare DOM. Con DOM 
mantieni in memoria l'albero dei nodi XML e attravero le API DOM lo puoi 
manipolare arbitrariamente.
Alternativamente puoi usare JDOM, specifico per Java, che ha un uso piů 
intuitivo:
http://www.jdom.org/
In rete č disponibile poi il seguente libro:
Processing XML with Java
http://www.cafeconleche.org/books/xmljava/
Che ha un sottotitolo indicativo: "A Guide to SAX, DOM, JDOM, JAXP and 
TrAX". Guarda qui per avere un'indicazione delle API migliori per il 
problema che devi risolvere.
Gaetano Bigliardi

 discendente di z, sax fornisce dei metodi?
Se vuoi utilizzare JDOM puoi usare i metodi della classe Element:
public Element addContent(Element element)
public boolean removeContent(Element element)
Trovi i Javadoc a partire dal sito JDOM:
http://www.jdom.org/docs/apidocs/index.html
Gaetano Bigliardi

 laboriosa. 
Il passaggio albero/lista e' mestiere del parser SAX. Il passaggio 
lista/albero consiste nel verficare il tipo di evento ed emettere testo di 
conseguenza: non e' particolarmente difficile (peraltro, ci sono 
"serializer" gia' pronti se non ricordo male); certamente e' meno 
intuitivo.


-gringo scrisse:
|| Certo che puo' servirti: mentre fai il parsing potresti ricopiare
|| "le cose" che incontri in un nuovo file (usando un XMLWriter
|| 
http://www.saxproject.org
) e quando ti arriva l'evento scatenato dal
|| riconoscimento di un elemento da sostituire lo sostituisci nel nuovo
|| file e continui cosi'...
||
||
| ma in questo modo devo creare un albero a partire da una lista, il
| che può essere complesso.
Credo di aver capito che a te serva proprio la manipolazione di una
struttura "ad albero", in questo caso mi sento di consigliarti DOM visto che
si avvicina logicamente al tuo obiettivo.
Ti ripeto che sostanzialmente puoi fare le stesse cose con DOM e SAX e
valgono le differenziaziono che ti ho fatto nel precedente post!
| L' XMLWriter a cui fai riferimento,
| consente di creare un albero a partire da un altro albero
| direttamente?
XMLWriter e DataWriter sono classi della libreria che ti ho segnalato in
precedenza che ti consentono di scrivere su uno "stream in XML"
in sosotanza qualcosa del tipo :
Sia fileXML un FileOutputStream
   PrintWriter myOutputStream = new PrintWriter(fileXML);
   DataWriter w = new DataWriter(myOutputStream);
   w.startDocument();
   w.startElement("NOME_TAG  attributo = valore ");
   .....
   w.endElement("NOME_TAG");
   w.endDocument();
Niente di eccezionale quindi.
Ti ripeto, forse nel tuo specifico caso (se non hai esigenze particolarmente
stringenti di memoria e velocita') ti conviene DOM
| grazie delle info
prego