View Full Version : [Java] aggiunta entry a file XML
misterxxitalia
22-12-2007, 18:15
ciao a tutti sto cercando di aggiunge un nominativo che gli do in imput io ovvero del tipo...
<nominativo>
<nome>Maria</nome>
<cognome>Bianchi</cognome>
<indirizzo>via Garibaldi 94/A, Torino</indirizzo>
<telefono>01112045678</telefono>
<affinita>conoscente</affinita>
</nominativo>
</rubrica>
ed aggiungerlo ad un file xml gia esistente.ora per motivi pratici "l'aggiunta" vuol dire prelevare tutti i nominativi esistenti dall'xml, caricarli in un vettore del tipo...
{
private ArrayList<Nominativo> nominativi;
public Rubrica ()
{
nominativi = new ArrayList<Nominativo> ();
}
dove per nominativo si intende:
Nominativo (String nome, String cognome, String indirizzo, String telefono, String affinita)
aggiungere il mio nominativo e riscrivere il tutto da capo.questa è la mia bozza di classe che ho scritto:
public class XMLWrite{
Document agg_persona()throws IOException, JDOMException
{
BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome");//aggiungo il nome in imput
System.out.print("=>");
String n = new String(d.readLine());
BufferedReader e = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il cognome");//aggiungo il cognome in imput
System.out.print("=>");
String c = new String(e.readLine());
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi l'indirizzo");//aggiungo l'indirizzo in imput
System.out.print("=>");
String i = new String(r.readLine());
BufferedReader j = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il numero di telefono");//aggiungo il numero di telefono in imput
System.out.print("=>");
String t = new String(j.readLine());
BufferedReader l = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi l'affinità");//aggiungo l'affinita in imput
System.out.print("=>");
String a = new String(l.readLine());
Element rubrica = new Element("rubrica"); //creo la radice del documento
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(n);//gli do il nome cognome in imput ecc
Element cognome = new Element("cognome"); cognome.setText(c);
Element indirizzo = new Element("indirizzo"); indirizzo.setText(i);
Element telefono = new Element("telefono"); telefono.setText(t);
Element affinita = new Element("affinita"); affinita.setText(a);
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
rubrica.addContent(nominativo); //chiudo il mio nominativo
Iterator<Nominativo> itr = nominativi.iterator();//creo un iteratore dove riversargli tutti i vecchi nominativi
while (itr.hasNext())
{
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(r.getnome());
Element cognome = new Element("cognome"); cognome.setText(r.getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(r.getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(r.gettelefono());
Element affinita = new Element("affinita"); affinita.setText(r.getaffinita());
rubrica.addContent(rubrica);//chiudo il documento
return new Document(rubrica);
}
dove per getnome():
public String getnome()
{
return nome;
}
il mio problema è che l'iteratore non mi accetta i metodi getnome() ecc..
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(r.getnome());
Element cognome = new Element("cognome"); cognome.setText(r.getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(r.getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(r.gettelefono());
Element affinita = new Element("affinita"); affinita.setText(r.getaffinita());
chi mi sa dire il perche?e cosa posso fare??
misterxxitalia
24-12-2007, 10:06
up!!:mc:
Ma non stai usando l'iteratore (itr) ma la variabile r che è un BufferedReader... Prova con:
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(itr.getnome());
Element cognome = new Element("cognome"); cognome.setText(itr.getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(itr.getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(itr.gettelefono());
Element affinita = new Element("affinita"); affinita.setText(itr.getaffinita());
misterxxitalia
24-12-2007, 14:26
ti ringrazio dell'aiuto!scusa ma sbaglio qualche cosa nella creazione dell'iteratore..
io da questo erray:
{
private ArrayList<Nominativo> nominativi;
public Rubrica ()
{
nominativi = new ArrayList<Nominativo> ();
}
dove sono caricati i nominativi devo usare un iteratore per scrivere:
Iterator<Nominativo> itr = nominativi.iterator();//creo un iteratore dove riversargli tutti i vecchi nominativi
while (itr.hasNext())
{
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(itr.getnome());
Element cognome = new Element("cognome"); cognome.setText(itr.getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(itr.getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(itr.gettelefono());
Element affinita = new Element("affinita"); affinita.setText(itr.getaffinita());
rubrica.addContent(rubrica);//chiudo il documento
return new Document(rubrica);
}}}
xo nominativi.iterator() scritto cosi non va bene....
misterxxitalia
26-12-2007, 12:03
:muro:
misterxxitalia
27-12-2007, 16:17
sono riuscito da solo a caricare l'array nel file xml!!ho creato questo metodo:
public void scriviArrayList()
{
Iterator<Nominativo> itr = nominativi.iterator();
while (itr.hasNext())
{
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(itr.next().getnome());
Element cognome = new Element("cognome"); cognome.setText(itr.next().getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(itr.next().gettelefono());
Element affinita = new Element("affinita"); affinita.setText(itr.next().getaffinita());
ora mi serve una sola cosa per favore...come faccio per ogni nominativo che ho nel file ad aggiungere la sua chiusura??mi spiego devo aggiungere questo...
</nome>
</cognome>
</indirizzo>
e so che il suo comando è questo:
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
rubrica.addContent(nominativo);
cosa posso fare con un ciclo??o cosa??
ora mi serve una sola cosa per favore...come faccio per ogni nominativo che ho nel file ad aggiungere la sua chiusura??mi spiego devo aggiungere questo...
</nome>
</cognome>
</indirizzo>
e so che il suo comando è questo:
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
rubrica.addContent(nominativo);
cosa posso fare con un ciclo??o cosa??
Scusami, forse non ho capito bene, ma se usi DOM per manipolare la struttura dell'XML, non occorre che ti preoccupi della chiusura XML degli elementi, fanno tutto in automatico le librerie, nel momento in cui tu scrivi i dati modificati su XML. :mbe:
misterxxitalia
28-12-2007, 16:49
no con jdom mi devo preoccupare di chiudere il file xml!!comunque per certi versi sono riuscito a risolvere...
import java.io.File; // Gestione defi files
import java.io.FileOutputStream; // Flusso in uscita
import java.io.IOException; // Errori di I/O
import java.io.PrintStream; // Flusso per la stampa
import java.util.Iterator; // Strumento per la scanione di liste
import java.util.List; // Lista di oggetti
import org.jdom.Document; // Documento XML
import org.jdom.Element; // Singolo elemento XML
import org.jdom.JDOMException; // Errori sulla gestione XML
import org.jdom.input.SAXBuilder; // Costruttore di documenti XML
import org.jdom.output.XMLOutputter; // Scrittore di documenti XML
import org.jdom.output.Format; // Formato
import java.io.*;
public class XMLWrite{
Document agg_persona()throws IOException, JDOMException
{
BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome");//aggiungo il nome in imput
System.out.print("=>");
String n = new String(d.readLine());
BufferedReader e = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il cognome");//aggiungo il cognome in imput
System.out.print("=>");
String c = new String(e.readLine());
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi l'indirizzo");//aggiungo l'indirizzo in imput
System.out.print("=>");
String i = new String(r.readLine());
BufferedReader j = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il numero di telefono");//aggiungo il numero di telefono in imput
System.out.print("=>");
String t = new String(j.readLine());
BufferedReader l = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi l'affinità");//aggiungo l'affinita in imput
System.out.print("=>");
String a = new String(l.readLine());
Element rubrica = new Element("rubrica"); //creo la radice del documento
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(n);//gli do il nome cognome in imput ecc
Element cognome = new Element("cognome"); cognome.setText(c);
Element indirizzo = new Element("indirizzo"); indirizzo.setText(i);
Element telefono = new Element("telefono"); telefono.setText(t);
Element affinita = new Element("affinita"); affinita.setText(a);
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
Rubrica f = new Rubrica ();
f.scriviArrayList();
rubrica.addContent(nominativo); //chiudo il mio nominativo
return new Document(rubrica);
}}
questa classe serve solo ad aggiungere il nominativo e creare il mio documento da scrivere.
questa è il metodo dove sono contenuti tutti i miei nominativi...
public void scriviArrayList()
{
Iterator<Nominativo> itr = nominativi.iterator();
while (itr.hasNext())
{
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(itr.next().getnome());
Element cognome = new Element("cognome"); cognome.setText(itr.next().getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(itr.next().gettelefono());
Element affinita = new Element("affinita"); affinita.setText(itr.next().getaffinita());
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
nominativo.addContent(nominativo);
}
xo secondo me sbaglio qualche cosa qui:
Rubrica f = new Rubrica ();
f.scriviArrayList();
perchè mi scrive solo il mio nominativo aggiunto!!
afsdfdlecosdfsfdcco
28-12-2007, 23:02
ehm..
perche' la rubrica la crei ogni volta che aggiungi un nominativo? In teoria dovresti memorizzarti un riferimento da qualche parte e usare sempre quello. Credo sia questo il problema (ma puo' darsi che mi sbaglio)
ah, evita di mandare email per richiamare l'attenzione su un thread.. ;
misterxxitalia
29-12-2007, 11:34
...scusami ma non sapevo a chi altro chiedere!!in questo metodo vengono memorizzati tutti i miei nominativi (in teoria)
public void scriviArrayList()
{
Iterator<Nominativo> itr = nominativi.iterator();
while (itr.hasNext())
{
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(itr.next().getnome());
Element cognome = new Element("cognome"); cognome.setText(itr.next().getcognome());
Element indirizzo = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
Element telefono = new Element("telefono"); telefono.setText(itr.next().gettelefono());
Element affinita = new Element("affinita"); affinita.setText(itr.next().getaffinita());
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
nominativo.addContent(nominativo);
e l'unico modo che mi è passato in mente sul momento per richiamare il documento e scriverlo è stato cosi...
Rubrica f = new Rubrica ();
f.scriviArrayList();
come mi consigli?non ti capisco...
afsdfdlecosdfsfdcco
29-12-2007, 11:56
...
e l'unico modo che mi è passato in mente sul momento per richiamare il documento e scriverlo è stato cosi...
Rubrica f = new Rubrica ();
f.scriviArrayList();
Ok, ma non puoi ricreare una nuova rubrica ogni volta che aggiungi un nominativo!
Quando devi scrivere un file xml, jdom riscrive da ZERO tutto il contenuto del file (anche se le differenze rispetto a prima sono minime). Nel modo che fai tu ogni volta scrive una rubrica che contiene un singolo elemento! (a proposito, non ho visto dove utilizzi l'XMLOutputter)
misterxxitalia
29-12-2007, 13:20
questo è il metodo di scrittura l'ho ricopiato tale e quale alla guida...(
void scrivi(Document rubrica)
{
// oggetto che si occupa di scrivere il documento nel file
XMLOutputter xmlOutputter = new XMLOutputter();
// imposto il formato del file xml prodottp
xmlOutputter.setFormat(Format.getPrettyFormat());
try
{
// stream per la scrittura
FileOutputStream fileOutputStream = new FileOutputStream(new File("rubrica.xml"));
xmlOutputter.output(rubrica, fileOutputStream);
}
catch (FileNotFoundException ex)
{
System.err.println(ex);
}
catch (IOException ex)
{
System.err.println(ex);
}
}
poi scusa ma la mia rubrica non contiene (attrarverso un iterator ed un while) tutti i nominativi contenuti nell'array??scusa ma nn ti afferro...
afsdfdlecosdfsfdcco
29-12-2007, 14:04
poi scusa ma la mia rubrica non contiene (attrarverso un iterator ed un while) tutti i nominativi contenuti nell'array??scusa ma nn ti afferro...
Dovrebbe, certo, ma se tu crei una nuova Rubrica vuota ogni volta che aggiungi un nominativo ti ritroverai con n rubriche ognuna con un nominativo...
misterxxitalia
29-12-2007, 14:34
si ma scrivendo cosi...
Rubrica f = new Rubrica ();
f.scriviArrayList();
creo una rubrica con un solo un nominativo caricato?come potrei fare?
misterxxitalia
02-01-2008, 14:42
up!!
afsdfdlecosdfsfdcco
02-01-2008, 15:24
si ma scrivendo cosi...
Rubrica f = new Rubrica ();
f.scriviArrayList();
creo una rubrica con un solo un nominativo caricato?come potrei fare?
Dichiaralo a livello di classe e non localmente ad un metodo
misterxxitalia
02-01-2008, 16:08
scusa ma non mi è facile capirti....:stordita:
afsdfdlecosdfsfdcco
02-01-2008, 17:13
scusa ma non mi è facile capirti....:stordita:
:mbe:
Tu hai dichiarato Rubrica r all'interno di un metodo. Il risultato è che ogni volta che chiami quel metodo crei una nuova rubrica. Tira fuori la creazione della rubrica da quel metodo e mettila a livello di classe, non di metodo... tutto qui ;) In questo modo la crei una volta sola.
misterxxitalia
02-01-2008, 19:28
aaaaaaa hai ragione!!!se io creo una nuova rubrica è normale che scrive nulla è vuoto!!!:doh:ora x accedere a nominativi (che è un array privato) mi sono creato un metodo che me lo richiami.
questo è nominativi
private ArrayList<Nominativo> nominativi;
public Rubrica ()
{
nominativi = new ArrayList<Nominativo> ();
}
e questo è il metodo..
public ArrayList getnominativi()
{
return nominativi;
}
ora xo come faccio a chiamare questo metodo senza creare una nuova rubrica?ovvero...
Iterator<Nominativo> itr = "il mio metodo".iterator();
while (itr.hasNext())
Scusami, non ho capito. La soluzione che interessa a te non è questa, vero:
Iterator<Nominativo> itr = getnominativi().iterator();
while (itr.hasNext()) {
...
}
Però se non è questa non ho capito cosa intendi! :(
misterxxitalia
02-01-2008, 22:23
vorrei scrivere cosi ma non posso accederci direttamente....teoricamente mi dovrei creare una nuova rubrica che non lo posso fare in questo caso...
afsdfdlecosdfsfdcco
03-01-2008, 10:09
vorrei scrivere cosi ma non posso accederci direttamente....teoricamente mi dovrei creare una nuova rubrica che non lo posso fare in questo caso...
Hai provato a tenere una copia del riferimento alla rubrica?
misterxxitalia
03-01-2008, 19:19
che intendi??
afsdfdlecosdfsfdcco
03-01-2008, 20:04
che intendi??
Non ho presente il codice completo ma presumo che da qualche parte hai un riferimento alla rubrica. Ecco, prendi questo riferimento e passalo alla classe che aggiunge i nominativi (in teoria dovrebbe essere la rubrica stessa che si aggiunge i nominativi...)
misterxxitalia
03-01-2008, 20:18
a ecco ora ti ho capito...ho portato tutto nella classe rubrica (effettivamente è una proprietà di rubrica...)non da errori ma quando vado a fare il debug il programma si ferma quando mi va a scrivere tutti i nominativi esattamente in questo punto:
Element indirizzo1 = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
e mi da questo errore che vuol dire?
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:350)
at Rubrica.agg_persona(Rubrica.java:90)
at XMLRead.main(XMLRead.java:51)
afsdfdlecosdfsfdcco
03-01-2008, 20:29
a ecco ora ti ho capito...ho portato tutto nella classe rubrica (effettivamente è una proprietà di rubrica...)non da errori ma quando vado a fare il debug il programma si ferma quando mi va a scrivere tutti i nominativi esattamente in questo punto:
Element indirizzo1 = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
e mi da questo errore che vuol dire?
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:350)
at Rubrica.agg_persona(Rubrica.java:90)
at XMLRead.main(XMLRead.java:51)
In
Element indirizzo1 = new Element("indirizzo"); indirizzo.setText(itr.next().getindirizzo());
usi indirizzo1 e indirizzo... E' solo una svista?
misterxxitalia
03-01-2008, 20:37
gli ho cambiato io il nome perchè "indirizzo" l'ho gia utilizzato prima x l'imput del mio nominativo..ovvero qui:
Element indirizzo = new Element("indirizzo"); indirizzo.setText(i);
Element telefono = new Element("telefono"); telefono.setText(t);
Element affinita = new Element("affinita"); affinita.setText(a);
ma cosa c'è di sbagliato??
afsdfdlecosdfsfdcco
03-01-2008, 21:05
mmm, usi ogni volta itr.next() all'interno del ciclo?
Cosi' intedo:
while (itr.hasNext()) {
indirizzo.setText(itr.next().getindirizzo());
nome.setText(itr.next().getnome());
cognome.setText(itr.next().getcognome());
}
In questo caso non va bene! ogni volta che chiami next() l'iteratore si sposta sull'elemento successivo! Nel mio esempio otterrai l'indirizzo del primo, il nome del secondo ed il cognome del terzo! Per poi continuare con l'indirizzo del quarto ecc
Devi fare una cosa del genere:
while (itr.hasNext()) {
Nominativo n = itr.next();
indirizzo.setText(n.getindirizzo());
nome.setText(n.getnome());
cognome.setText(n.getcognome());
}
misterxxitalia
03-01-2008, 21:51
si ma io mi devo ritrovare nome cognome ecc...in un ordine preciso non mi è ancora chiaro il tuo ragionamento comunque...
while (itr.hasNext())
{
Nominativo q = itr.next();
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
nome.setText(q.getnome());
cognome.setText(q.getcognome());
indirizzo.setText(q.getindirizzo());
affinita.setText(q.getaffinita());
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
nominativo.addContent(nominativo);
se voglio chiudere il nominativo (nominativo.addConttent...)non me lo permette di fare xchè ho già chiuso in precedenza il mio nominativo che ho aggiunto...
org.jdom.IllegalAddException: The Content already has an existing parent "nominativo"
at org.jdom.ContentList.add(ContentList.java:209)
at org.jdom.ContentList.add(ContentList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at org.jdom.Element.addContent(Element.java:811)
at Rubrica.agg_persona(Rubrica.java:93)
at XMLRead.main(XMLRead.java:51)
pero il mio nominativo deve per forza iniziare e terminare col tag "nominativo" & "/nominativo" che sbaglio??
afsdfdlecosdfsfdcco
04-01-2008, 10:03
si ma io mi devo ritrovare nome cognome ecc...in un ordine preciso non mi è ancora chiaro il tuo ragionamento comunque...
E proprio perche' ti servono in un ordine preciso non puoi usare piu' volte next() all'intero della stessa iterazione!
se voglio chiudere il nominativo (nominativo.addConttent...)non me lo permette di fare xchè ho già chiuso in precedenza il mio nominativo che ho aggiunto...
org.jdom.IllegalAddException: The Content already has an existing parent "nominativo"
at org.jdom.ContentList.add(ContentList.java:209)
at org.jdom.ContentList.add(ContentList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at org.jdom.Element.addContent(Element.java:811)
at Rubrica.agg_persona(Rubrica.java:93)
at XMLRead.main(XMLRead.java:51)
pero il mio nominativo deve per forza iniziare e terminare col tag "nominativo" & "/nominativo" che sbaglio??
Perche' fai nominativo.addContent(nominativo)?? Non si puo' fare una cosa del genere!
misterxxitalia
04-01-2008, 11:58
ho risolto cosi':
Element rubrica = new Element("rubrica"); //creo la radice del documento
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome"); nome.setText(n);//gli do il nome cognome in imput ecc
Element cognome = new Element("cognome"); cognome.setText(c);
Element indirizzo = new Element("indirizzo"); indirizzo.setText(i);
Element telefono = new Element("telefono"); telefono.setText(t);
Element affinita = new Element("affinita"); affinita.setText(a);
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
Iterator<Nominativo> itr = getnominativi().iterator();
while (itr.hasNext())
{
Nominativo q = itr.next();
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome1 = new Element("nome");nome.setText(q.getnome());
Element cognome1 = new Element("cognome");cognome.setText(q.getcognome());
Element indirizzo1 = new Element("indirizzo");indirizzo.setText(q.getindirizzo());
Element telefono1 = new Element("telefono");indirizzo.setText(q.gettelefono());
Element affinita1 = new Element("affinita");affinita.setText(q.getaffinita());
nominativo1.addContent(nome1);
nominativo1.addContent(cognome1);
nominativo1.addContent(indirizzo1);
nominativo1.addContent(telefono1);
nominativo1.addContent(affinita1);
}
rubrica.addContent(nominativo); //chiudo il mio nominativo
return new Document(rubrica);
pero nel file xml trovo scritta una sola persona caricata precedentemente nel vettore sicuramente sbaglio qualche cosa nella chiusura del file xml...
Credo che ci siano un paio di errori. Così dovrebbe funzionare meglio:
Iterator<Nominativo> itr = getnominativi().iterator();
while (itr.hasNext())
{
Nominativo q = itr.next();
Element nominativo1 = new Element("nominativo");//creo il nominativo da inserire
Element nome1 = new Element("nome");nome1.setText(q.getnome());
Element cognome1 = new Element("cognome");cognome1.setText(q.getcognome());
Element indirizzo1 = new Element("indirizzo");indirizzo1.setText(q.getindirizzo());
Element telefono1 = new Element("telefono");telefono1.setText(q.gettelefono());
Element affinita1 = new Element("affinita");affinita1.setText(q.getaffinita());
nominativo1.addContent(nome1);
nominativo1.addContent(cognome1);
nominativo1.addContent(indirizzo1);
nominativo1.addContent(telefono1);
nominativo1.addContent(affinita1);
// E qui? Cosa ti serve costruire "nominativo1" se poi non lo usi?
}
rubrica.addContent(nominativo); //chiudo il mio nominativo
return new Document(rubrica);
Creavi un elemento nome1, e settavi il valore di nome, eccetera.
Non ho ancora capito a che ti serva creare un "nominativo1" che poi non usi mai. :wtf:
misterxxitalia
05-01-2008, 14:12
nominativo1 serve solo per scrivere tutti i nominativi presenti nel vettore e "creare" il documento da scrivere....cosa intendi?
misterxxitalia
10-01-2008, 17:56
per motivi "scolastici" ho trasformato il mio array list in vector e come mi è stato consigliato aggiungo un nominativo nel vettore e poi vado a scrivere il vettore..quindi ho semplificato il tutto cosi':
Document documrubrica()throws IOException, JDOMException
{
Element rubrica = new Element("rubrica");
Enumeration e = getnominativi().elements();
while (e.hasMoreElements())
{
Nominativo q = (Nominativo)e.nextElement();
Element nominativo = new Element("nominativo");//creo il nominativo da inserire
Element nome = new Element("nome");nome.setText(q.getnome());
Element cognome = new Element("cognome");cognome.setText(q.getcognome());
Element indirizzo = new Element("indirizzo");indirizzo.setText(q.getindirizzo());
Element telefono = new Element("telefono");telefono.setText(q.gettelefono());
Element affinita = new Element("affinita");affinita.setText(q.getaffinita());
nominativo.addContent(nome);
nominativo.addContent(cognome);
nominativo.addContent(indirizzo);
nominativo.addContent(telefono);
nominativo.addContent(affinita);
}
rubrica.addContent(nominativo); //chiudo il mio nominativo
return new Document(rubrica);
}
nel while ogni volta che creo un nominativo lo devo anche chiudere..
Element nominativo = new Element("nominativo");
ma come posso scrivere?insomma sbaglio sicuramente qualche cosa nella chiusura del file.mi potreste aiutare??non ne posso più della classe jdom!!
Innanzitutto ti devo delle scuse: avevo letto male all'inizio e credevo che tu usassi il package org.w3c.dom (che si trova nelle librerie standard), non sapevo neanche dell'esistenza di questo JDOM, forse perchè ho cominciato a lavorare con XML un po' più tardi... :D
La butto lì, a occhio, può anche non funzionare ma:
Document documrubrica(Nominativo nuovoNominativo) throws IOException, JDOMException {
Element rubrica = new Element("rubrica");
for(Enumeration en = getNominativi().elements(); en.hasMoreElements(); ) {
// Visto che c'è un metodo "clone()", sfruttiamolo!
rubrica.addContent(((Element)en.nextElement()).clone());
}
// Adesso aggiungo il mio nominativo
rubrica.addContent(nuovoNominativo);
return new Document(rubrica); // Fine
}
Devi passare a questo metodo il nuovo nominativo da inserire in fondo.
Comunque: perchè non passare a org.w3c.dom? :sofico:
misterxxitalia
11-01-2008, 09:57
org.w3c.dom??non so che dirti...è piu facile da usare??ora mi spiego meglio questo metodo che sto creando mi prepara un documento che verrà scritto da una classe apposta.questo è il tipico documento xml:
<rubrica>
−
<nominativo>
<nome>Paolo</nome>
<cognome>Rossi</cognome>
<indirizzo>via Marconi 14, Milano</indirizzo>
<telefono>0212345678</telefono>
<affinita>amicone</affinita>
</nominativo>
−
<nominativo>
<nome>Maria</nome>
<cognome>Bianchi</cognome>
<indirizzo>via Garibaldi 94/A, Torino</indirizzo>
<telefono>01112045678</telefono>
<affinita>conoscente</affinita>
</nominativo>
</rubrica>
io scrivo rubrica.addContent(nuovoNominativo); ecc per chiudere i tag!xo sicuramente pecco in qualche chiusura xche mi ritrovo il documento xml completamente vuoto!!
ABCcletta
11-01-2008, 13:54
Per scrivere usa questo metodo:
private void writeXML() {
try {
new XMLOutputter().output(doc, System.out);
new XMLOutputter().output(doc, new FileWriter(xmlDOC));
} catch(IOException ioe) {
ioe.printStackTrace();
System.exit(1);
}
}
Dove:
String xmlDOC = "nomefile.xml"
Document doc = new SAXBuilder().build(xmlDOC);
Non so come tu abbia implementato il tutto, comunque con il riferimento "doc" puoi effettuare tutte le operazioni che ti servono sul documento ottenendo la radice col metodo .getRootElement().
Quando scrivi con l'XMLOutputter inoltre vengono scritti soltanto i cambiamenti realmente effettuati e non viene riscritto il file da 0 (ho testato personalmente questa particolarità per motivi prestazionali).
misterxxitalia
11-01-2008, 15:51
guarda forse non ci capiamo io dal mio vettore devo estrapolare tutti i miei nominativi (col metodo getnominativi ecc...)e preparare un documento....
return new Document(rubrica);
che verrà poi scritto da questo metodo....
void scrivi(Document rubrica)
{
// oggetto che si occupa di scrivere il documento nel file
XMLOutputter xmlOutputter = new XMLOutputter();
// imposto il formato del file xml prodottp
xmlOutputter.setFormat(Format.getPrettyFormat());
try
{
// stream per la scrittura
FileOutputStream fileOutputStream = new FileOutputStream(new File("archivio_cd.xml"));
xmlOutputter.output(rubrica, fileOutputStream);
}
catch (FileNotFoundException ex)
{
System.err.println(ex);
}
catch (IOException ex)
{
System.err.println(ex);
}
}
ora il mio problema è che sbaglio sicuramente qualche cosa nella creazione del documento perchè me lo ritrovo vuoto!
ABCcletta
11-01-2008, 16:45
Guarda sarebbe stato preferibile se avessi postato l'intera classe commentando qua e la. A leggere tutti i pezzi di codice che hai postato mi è venuto il mal di testa e ho rinunciato.
Eccoti un esempio di come vanno trattati i documenti in Jdom, prendi spunto e vedrai che tutto funzionerà:
// vari import
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.ListIterator;
// jdom import
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class DocParser {
private Element radice = null;
private Document doc = null;
private static String xmlDOC;
private List listaRecord;
public DocParser(String nomefile) throws JDOMException, IOException {
xmlDOC = new String(nomefile);
// fa il parse del documento e ottiene la radice
doc = new SAXBuilder().build(xmlDOC);
radice = doc.getRootElement();
// crea una lista dei record nel documento
listaRecord = radice.getChildren("record");
}
public void insertRecord(Record record) {
// inserisce un record nel documento
// ogni record è un bean con i seguenti attributi: id (univoco, non modificabile), name
Element recordEle = new Element("record");
Element temp = new Element("id");
temp.setText(record.getID());
recordEle.addContent(temp);
recordEle.addContent("\n\t\t");
temp = new Element("name");
temp.setText(record.getName());
recordEle.addContent(temp);
recordEle.addContent("\n\t\t");
radice.addContent("\t");
radice.addContent(recordEle);
radice.addContent("\n");
writeXML();
}
public void modifyRecord(Record record) {
// modifica gli attributi di un singolo record nel documento dopo averlo cercato
ListIterator recordIterator = listaRecord.listIterator();
while(recordIterator.hasNext()) {
Element temp = (Element) recordIterator.next();
if( Integer.parseInt(temp.getChildText("id")) == record.getID() ) {
Element child = temp.getChild("name");
child.setText(record.getName());
break;
}
}
writeXML();
}
public void deleteRecord(int ID) {
// elimina un record e resetta tutti gli ID
ListIterator recordIterator = listaRecord.listIterator();
int i = 1;
Element toErase = null;
while(recordIterator.hasNext()) {
Element temp = (Element) recordIterator.next();
if( Integer.parseInt(temp.getChildText("id")) == ID ) {
toErase = temp;
continue;
}
(temp.getChild("id")).setText("" + i);
i++;
}
radice.removeContent(toErase);
writeXML();
}
private void writeXML() {
// scrive il documento su file
try {
new XMLOutputter().output(doc, System.out);
new XMLOutputter().output(doc, new FileWriter(xmlDOC));
} catch(IOException ioe) {
ioe.printStackTrace();
System.exit(1);
}
}
}
Ho composto il codice copiando pezzi qua e là dalle mie classi, quindi potrebbe esserci qualche errore. Ad ogni modo le funzionalità principali che un xml document handler dovrebbe avere sono queste. Almeno così perdi tu tempo a leggere il mio codice :D
misterxxitalia
11-01-2008, 18:39
:D effettivamente ho incasinato il post!!!a ecco ora ti ho capito io per aggiungere un nominativo lo aggiungevo al vettore e poi riscrivevo il tutto mentre tu vai direttamente ad aggiungerlo nel file xml!!!ora mi studio bene la cosa ma io devo prima caricare tutto nel vettore...mi potresti spiegare come funziona il tuo metodo x la scrittura??(lo hai scritto sopra...:Prrr: )
ABCcletta
11-01-2008, 18:51
:D effettivamente ho incasinato il post!!!a ecco ora ti ho capito io per aggiungere un nominativo lo aggiungevo al vettore e poi riscrivevo il tutto mentre tu vai direttamente ad aggiungerlo nel file xml!!!ora mi studio bene la cosa ma io devo prima caricare tutto nel vettore...mi potresti spiegare come funziona il tuo metodo x la scrittura??(lo hai scritto sopra...:Prrr: )
Certo, allora le righe che si riferiscono a XMLOutputter creano un oggetto con default Format e mentre la prima scrive l'output in console, la seconda scrive l'output su file utilizzando FileWriter :)
misterxxitalia
11-01-2008, 19:06
scusa e quale è il metodo per l'aggiunta del nominativo senza riscrittura completa?a sto punto mi creo un metodo che mi aggiunge il nominativo al vettore e contemporaneamente me lo aggiunge al file xml...
ABCcletta
11-01-2008, 19:13
scusa e quale è il metodo per l'aggiunta del nominativo senza riscrittura completa?a sto punto mi creo un metodo che mi aggiunge il nominativo al vettore e contemporaneamente me lo aggiunge al file xml...
La classe che ho scritto io, ad ogni inserimento di un record scrive su file. Ho effettuato delle prove (scrivendo dei caratteri random direttamente all'interno del file) e sembra che l'Outputter scriva solo i cambiamenti su file. Non ne ho la completa sicurezza però.
misterxxitalia
11-01-2008, 22:04
scusa a cosa serve "doc" (è nullo...)e "FileWriter(xmlDOC)" xmlDOC sarà il nome del file xml?
ABCcletta
11-01-2008, 22:34
scusa a cosa serve "doc" (è nullo...)e "FileWriter(xmlDOC)" xmlDOC sarà il nome del file xml?
:mbe: Ma dici davvero o scherzi?
Non vedi che vengono inizializzati nel costruttore? :D
misterxxitalia
12-01-2008, 11:31
ti ringrazio dell'aiuto vedendo il tuo codice ho capito cosa ho sbagliato!!un'ultima cosa il metodo di scrittura il tuo (writexml) lo hai messo privato...se io lo lascio pubblico c'è il rischio di qualche indesiderata manipolazione?te lo chiedo xche ho bisogno di chiamare il metodo in altre classi!!scusa ma java lo sto studiando da poco!:D
ABCcletta
12-01-2008, 14:47
ti ringrazio dell'aiuto vedendo il tuo codice ho capito cosa ho sbagliato!!un'ultima cosa il metodo di scrittura il tuo (writexml) lo hai messo privato...se io lo lascio pubblico c'è il rischio di qualche indesiderata manipolazione?te lo chiedo xche ho bisogno di chiamare il metodo in altre classi!!scusa ma java lo sto studiando da poco!:D
L'ho messo privato perchè lo chiamo dai metodi della classe stessa. Per come è concepita quella classe non va esportato (semplicemente da una classe esterna chiami inserimento/modifica/cancellazione e la scrittura viene fatta automaticamente). Nulla ti vieta però di renderlo pubblico, ma avrebbe senso solo in caso di revisione del comportamento della classe.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.