odiojava.net
24-09-2008, 17:49
Salve!
Stò avendo problemi nel fare l'ordinamento di un file xml usando le librerie jdom.
Questo è il codice che ho scritto:
int selezione = 0;
String locazione = casellasfoglia.getText();
impegno ciccio = new impegno (locazione,selezione);
int alto = ciccio.getnumele(locazione);
Element agenda = new Element("agenda");
Element appuntamento = new Element("appuntamento");
Element gdescrizione = new Element ("descrizione");
Element nome = new Element("nome");
Element cognome = new Element("cognome");
Element gdata = new Element("data");
Element gora = new Element ("ora");
Element gpriorita = new Element ("priorita");
for (int i=0;i<ciccio.getnumele(locazione);i++){
ciccio = new impegno (locazione,i);
gdescrizione = new Element ("descrizione"); gdescrizione.setText(ciccio.getdescrizione());
nome = new Element("nome"); nome.setText(ciccio.getnome());
cognome = new Element("cognome"); cognome.setText(ciccio.getcognome());
gdata = new Element("data"); gdata.setText(ciccio.getdatastring());
gora = new Element ("ora"); gora.setText(ciccio.getora());
gpriorita = new Element ("priorita"); gpriorita.setText(ciccio.getpriorita());
appuntamento = new Element("appuntamento");
appuntamento.addContent(gdescrizione);
appuntamento.addContent(nome);
appuntamento.addContent(cognome);
appuntamento.addContent(gdata);
appuntamento.addContent(gora);
appuntamento.addContent(gpriorita);
agenda.addContent(appuntamento);
}
Element agenda2 = agenda;
List backup = agenda.getChildren("appuntamento");
List backup2 = agenda2.getChildren("appuntamento");
Iterator pointer = backup.iterator();
Iterator pointer2 = backup2.iterator();
String descrizionetmp = new String();
String nometmp = new String();
String cognometmp = new String();
String datatmp = new String();
String oratmp = new String();
String prioritatmp = new String();
int giorno1 = 0;
int mese1 = 0;
int anno1 = 0;
GregorianCalendar data1 = new GregorianCalendar();
int giorno2 = 0;
int mese2 = 0;
int anno2 = 0;
GregorianCalendar data2 = new GregorianCalendar();
while (alto > 0)
{
pointer = backup.iterator();
pointer2 = backup2.iterator();
agenda2 = (Element) pointer2.next();
for (int c=0;c<alto-1;c++)
{
agenda = (Element) pointer.next();
agenda2 = (Element) pointer2.next();
giorno1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(0,2));
mese1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(3,5));
anno1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(6,10));
data1 = new GregorianCalendar(anno1,(mese1-1),giorno1);
giorno2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(0,2));
mese2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(3,5));
anno2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(6,10));
data2 = new GregorianCalendar(anno2,(mese2-1),giorno2);
System.out.println("C: " + c + ", nome agenda1 :" + agenda.getChild("nome").getTextTrim()+ ", nome agenda2 :" + agenda2.getChild("nome").getTextTrim() + ", data1 :" +
data1.get(GregorianCalendar.DAY_OF_MONTH) + "/" +
(data1.get(GregorianCalendar.MONTH)+1) + "/" +
data1.get(GregorianCalendar.YEAR) + ", data2 :" +
data2.get(GregorianCalendar.DAY_OF_MONTH) + "/" +
(data2.get(GregorianCalendar.MONTH)+1) + "/" +
data2.get(GregorianCalendar.YEAR));
if (data1.after(data2)==true)
{
// //temp <- agenda
System.out.println("Scambio effettuato tra " + agenda.getChild("nome").getTextTrim() + " e " + agenda2.getChild("nome").getTextTrim());
descrizionetmp = agenda.getChild("descrizione").getTextTrim();
nometmp = agenda.getChild("nome").getTextTrim();
cognometmp = agenda.getChild("cognome").getTextTrim();
datatmp = agenda.getChild("data").getTextTrim();
oratmp = agenda.getChild("ora").getTextTrim();
prioritatmp = agenda.getChild("priorita").getTextTrim();
//agenda <-- agenda2
agenda.getChild("descrizione").setText(agenda2.getChild("descrizione").getTextTrim());
agenda.getChild("nome").setText(agenda2.getChild("nome").getTextTrim());
agenda.getChild("cognome").setText(agenda2.getChild("cognome").getTextTrim());
agenda.getChild("data").setText(agenda2.getChild("data").getTextTrim());
agenda.getChild("ora").setText(agenda2.getChild("ora").getTextTrim());
agenda.getChild("priorita").setText(agenda2.getChild("priorita").getTextTrim());
//agenda2 <-- tmp
agenda2.getChild("descrizione").setText(descrizionetmp);
agenda2.getChild("nome").setText(nometmp);
agenda2.getChild("cognome").setText(cognometmp);
agenda2.getChild("data").setText(datatmp);
agenda2.getChild("ora").setText(oratmp);
agenda2.getChild("priorita").setText(prioritatmp);
}
}
alto--;
}
pointer = backup.iterator();
pointer2 = backup2.iterator();
XMLOutputter xmlOut = new XMLOutputter();
xmlOut.setFormat(Format.getPrettyFormat());
FileOutputStream output;
try {
output = new FileOutputStream(new File(locazione));
xmlOut.output(new Document(agenda),output);
} catch (IOException erIO) {
System.out.println("IO Exception");
}
Ok magari a primo impatto sembra molto incasinato come codice.. ed in effetti lo è :P
Bisogna focalizzarsi principalmente sulla parte dell'ordinamento (fatto tramite Bubble sort), quando inizia il ciclo While per intenderci.
Il codice viene compilato (stranamente) senza problemi ma quando vado in esecuzione ho quest'errore:
Exception in thread "AWT-EventQueue-0" org.jdom.IllegalAddException: The Content already has an existing parent "agenda"
Quell'errore non mi è nuovo, l'ho già visto quando usavo il "agenda.addcontent" a sproposito.. ma stavolta pare sia diverso.
Il problema infatti avviene al momento della scrittura del file, dopo aver ordinato il tutto.
Commentando il codice di scrittura infatti non ci sono problemi di sorta.
Ho provato anche a commentare la fase dello "scambio", ma il problema resta sempre lo stesso.
Se commento tutto l'ordinamento non ci sono problemi.
Insomma.. in teoria il problema è in quello che viene eseguito dentro il for ma non dentro l'if (c'è un solo for quindi non è difficile capire a quel mi riferisco :P ) ma non riesco proprio a capire cosa diavolo può essere.
ps: stò scrivendo il tutto con netbeans e dopo aver fatto una GUI, quindi c'è un riferimento ad una casella, per l'appunto "casellasfoglia"
Grazie, mi ci stò ammattendo :P
Stò avendo problemi nel fare l'ordinamento di un file xml usando le librerie jdom.
Questo è il codice che ho scritto:
int selezione = 0;
String locazione = casellasfoglia.getText();
impegno ciccio = new impegno (locazione,selezione);
int alto = ciccio.getnumele(locazione);
Element agenda = new Element("agenda");
Element appuntamento = new Element("appuntamento");
Element gdescrizione = new Element ("descrizione");
Element nome = new Element("nome");
Element cognome = new Element("cognome");
Element gdata = new Element("data");
Element gora = new Element ("ora");
Element gpriorita = new Element ("priorita");
for (int i=0;i<ciccio.getnumele(locazione);i++){
ciccio = new impegno (locazione,i);
gdescrizione = new Element ("descrizione"); gdescrizione.setText(ciccio.getdescrizione());
nome = new Element("nome"); nome.setText(ciccio.getnome());
cognome = new Element("cognome"); cognome.setText(ciccio.getcognome());
gdata = new Element("data"); gdata.setText(ciccio.getdatastring());
gora = new Element ("ora"); gora.setText(ciccio.getora());
gpriorita = new Element ("priorita"); gpriorita.setText(ciccio.getpriorita());
appuntamento = new Element("appuntamento");
appuntamento.addContent(gdescrizione);
appuntamento.addContent(nome);
appuntamento.addContent(cognome);
appuntamento.addContent(gdata);
appuntamento.addContent(gora);
appuntamento.addContent(gpriorita);
agenda.addContent(appuntamento);
}
Element agenda2 = agenda;
List backup = agenda.getChildren("appuntamento");
List backup2 = agenda2.getChildren("appuntamento");
Iterator pointer = backup.iterator();
Iterator pointer2 = backup2.iterator();
String descrizionetmp = new String();
String nometmp = new String();
String cognometmp = new String();
String datatmp = new String();
String oratmp = new String();
String prioritatmp = new String();
int giorno1 = 0;
int mese1 = 0;
int anno1 = 0;
GregorianCalendar data1 = new GregorianCalendar();
int giorno2 = 0;
int mese2 = 0;
int anno2 = 0;
GregorianCalendar data2 = new GregorianCalendar();
while (alto > 0)
{
pointer = backup.iterator();
pointer2 = backup2.iterator();
agenda2 = (Element) pointer2.next();
for (int c=0;c<alto-1;c++)
{
agenda = (Element) pointer.next();
agenda2 = (Element) pointer2.next();
giorno1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(0,2));
mese1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(3,5));
anno1 = Integer.parseInt(agenda.getChild("data").getTextTrim().substring(6,10));
data1 = new GregorianCalendar(anno1,(mese1-1),giorno1);
giorno2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(0,2));
mese2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(3,5));
anno2 = Integer.parseInt(agenda2.getChild("data").getTextTrim().substring(6,10));
data2 = new GregorianCalendar(anno2,(mese2-1),giorno2);
System.out.println("C: " + c + ", nome agenda1 :" + agenda.getChild("nome").getTextTrim()+ ", nome agenda2 :" + agenda2.getChild("nome").getTextTrim() + ", data1 :" +
data1.get(GregorianCalendar.DAY_OF_MONTH) + "/" +
(data1.get(GregorianCalendar.MONTH)+1) + "/" +
data1.get(GregorianCalendar.YEAR) + ", data2 :" +
data2.get(GregorianCalendar.DAY_OF_MONTH) + "/" +
(data2.get(GregorianCalendar.MONTH)+1) + "/" +
data2.get(GregorianCalendar.YEAR));
if (data1.after(data2)==true)
{
// //temp <- agenda
System.out.println("Scambio effettuato tra " + agenda.getChild("nome").getTextTrim() + " e " + agenda2.getChild("nome").getTextTrim());
descrizionetmp = agenda.getChild("descrizione").getTextTrim();
nometmp = agenda.getChild("nome").getTextTrim();
cognometmp = agenda.getChild("cognome").getTextTrim();
datatmp = agenda.getChild("data").getTextTrim();
oratmp = agenda.getChild("ora").getTextTrim();
prioritatmp = agenda.getChild("priorita").getTextTrim();
//agenda <-- agenda2
agenda.getChild("descrizione").setText(agenda2.getChild("descrizione").getTextTrim());
agenda.getChild("nome").setText(agenda2.getChild("nome").getTextTrim());
agenda.getChild("cognome").setText(agenda2.getChild("cognome").getTextTrim());
agenda.getChild("data").setText(agenda2.getChild("data").getTextTrim());
agenda.getChild("ora").setText(agenda2.getChild("ora").getTextTrim());
agenda.getChild("priorita").setText(agenda2.getChild("priorita").getTextTrim());
//agenda2 <-- tmp
agenda2.getChild("descrizione").setText(descrizionetmp);
agenda2.getChild("nome").setText(nometmp);
agenda2.getChild("cognome").setText(cognometmp);
agenda2.getChild("data").setText(datatmp);
agenda2.getChild("ora").setText(oratmp);
agenda2.getChild("priorita").setText(prioritatmp);
}
}
alto--;
}
pointer = backup.iterator();
pointer2 = backup2.iterator();
XMLOutputter xmlOut = new XMLOutputter();
xmlOut.setFormat(Format.getPrettyFormat());
FileOutputStream output;
try {
output = new FileOutputStream(new File(locazione));
xmlOut.output(new Document(agenda),output);
} catch (IOException erIO) {
System.out.println("IO Exception");
}
Ok magari a primo impatto sembra molto incasinato come codice.. ed in effetti lo è :P
Bisogna focalizzarsi principalmente sulla parte dell'ordinamento (fatto tramite Bubble sort), quando inizia il ciclo While per intenderci.
Il codice viene compilato (stranamente) senza problemi ma quando vado in esecuzione ho quest'errore:
Exception in thread "AWT-EventQueue-0" org.jdom.IllegalAddException: The Content already has an existing parent "agenda"
Quell'errore non mi è nuovo, l'ho già visto quando usavo il "agenda.addcontent" a sproposito.. ma stavolta pare sia diverso.
Il problema infatti avviene al momento della scrittura del file, dopo aver ordinato il tutto.
Commentando il codice di scrittura infatti non ci sono problemi di sorta.
Ho provato anche a commentare la fase dello "scambio", ma il problema resta sempre lo stesso.
Se commento tutto l'ordinamento non ci sono problemi.
Insomma.. in teoria il problema è in quello che viene eseguito dentro il for ma non dentro l'if (c'è un solo for quindi non è difficile capire a quel mi riferisco :P ) ma non riesco proprio a capire cosa diavolo può essere.
ps: stò scrivendo il tutto con netbeans e dopo aver fatto una GUI, quindi c'è un riferimento ad una casella, per l'appunto "casellasfoglia"
Grazie, mi ci stò ammattendo :P