Ho un problema che non riesco a risolvere. da un html con un form per inserire i dati di chi si deve registrare al sito dall'action di tale form viene lanciata una servlet.
La servlet verifica se il file registrati.xml esiste, se non esiste lo crea e aggiunge il registrato che ha avuto la fortuna di essere stato il primo a registrarsi al sito.
Se il file invece esiste non fa altro che caricarlo in memoria analizzarlo per vedere se un registrato ha la password uguale a quella dell'utente che sta tentando di registrarsi, se uno ce la uguale allora comunica che la registrazione è fallita causa duplicazione pasword altrimenti agiunge il nuovo registyrato allla struttura ad albero del documento e poi riscrive il file.
Funziona tutto per il primo utente che si registra (viene creato registrati.xml con il primo registrato - c'è perchè ho verificato) poi appena tento di aggiungere altri registrati mi dice che

org.jdom.IllegalAddException: The Content already has an existing parent "registrati"
org.jdom.ContentList.add(ContentList.java:218)
org.jdom.ContentList.add(ContentList.java:140)
java.util.AbstractList.add(AbstractList.java:89)
org.jdom.Element.addContent(Element.java:809)
registrazione.aggiungiRegistrato(registrazione.jav a:67)
registrazione.doPost(registrazione.java:144)
javax.servlet.http.HttpServlet.service(HttpServlet .java:710)
javax.servlet.http.HttpServlet.service(HttpServlet .java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.10 logs.

La struttura del registrati.xml è questa
codice:
<?xml version="1.0" encoding="UTF-8"?>
<registrati>
<registrato password="p" username="p" ruolo="generico">
<nome>p</nome>
<cognome>p</cognome>
<via>p</via>
<numciv>p</numciv>
<city>p</city><area/>
<telefono>p</telefono>
<provincia>pp</provincia>
<cap>p</cap>
<nazione>p</nazione>
<professione>pp</professione>
<data_di_nascita>
<giorno />
<mese />
<anno />
</data_di_nascita>
</registrato>
</registrati>
MENTRE LA SERVLET è QUESTA:
codice:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.io.File;
import java.util.*;
import java.text.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import java.util.Iterator;
import java.util.List;
				
public class registrazione extends HttpServlet{
	StringBuffer buf = new StringBuffer();
	Document documento = null;
	Element elementoRegistrati;
	Element registrato = new Element("registrato");
	String nome,cognome,via,numciv,città,area,telefono,provincia,cap,nazione,professione,giorno_nascita,mese_nascita,anno_nascita,password_inviata,username_inviato;	
	public void aggiungiRegistrato(){
		Element element_nome = new Element("nome");
		Element element_cognome = new Element("cognome");
		Element element_via = new Element("via");
		Element element_numciv = new Element("numciv");
		Element element_city = new Element("city");
		Element element_area = new Element("area");
		Element element_telefono = new Element("telefono");
		Element element_provincia = new Element("provincia");
		Element element_cap = new Element("cap");
		Element element_nazione = new Element("nazione");
		Element element_professione = new Element("professione");
		Element element_giorno = new Element("giorno");
		Element element_mese = new Element("mese");
		Element element_anno = new Element("anno");
		Element nascita = new Element("data_di_nascita");
		element_nome.setText(nome);
		element_cognome.setText(cognome);
		element_via.setText(via);
		element_numciv.setText(numciv);
		element_city.setText(città);
		element_area.setText(area);
		element_telefono.setText(telefono);
		element_provincia.setText(provincia);
		element_cap.setText(cap);
		element_nazione.setText(nazione);
		element_professione.setText(professione);
		element_giorno.setText(giorno_nascita);
		element_mese.setText(mese_nascita);
		element_anno.setText(anno_nascita);
		nascita.addContent(element_giorno);
		nascita.addContent(element_mese);
		nascita.addContent(element_anno);
		registrato.addContent(element_nome);
		registrato.addContent(element_cognome);
		registrato.addContent(element_via);
		registrato.addContent(element_numciv);
		registrato.addContent(element_city);
		registrato.addContent(element_area);	
		registrato.addContent(element_telefono);
		registrato.addContent(element_provincia);
		registrato.addContent(element_cap);
		registrato.addContent(element_nazione);
		registrato.addContent(element_professione);
		registrato.addContent(nascita);
		registrato.setAttribute("password",password_inviata);
		registrato.setAttribute("username",username_inviato);
		registrato.setAttribute("ruolo","generico");	
		elementoRegistrati.addContent(registrato);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		response.setContentType("text/html");
		PrintWriter responseOutput = response.getWriter();
		String controllo = new String("ok");
		//RECUPERO LE INFORMAZIONI INVIATE DAL FORM
		nome = request.getParameter("nome");
		cognome = request.getParameter("cognome");
		via = request.getParameter("via");
		numciv =request.getParameter("numciv");
		città =request.getParameter("città");
		area =request.getParameter("area");
		telefono =request.getParameter("telefono");
		provincia =request.getParameter("provincia");
		cap =request.getParameter("cap");
		nazione =request.getParameter("nazione");
		professione =request.getParameter("professione");
		giorno_nascita = request.getParameter("giorno_nascita");
		mese_nascita = request.getParameter("mese_nascita");
		anno_nascita = request.getParameter("anno_nascita");
		password_inviata = request.getParameter("password_registrazione");
		username_inviato = request.getParameter("username_registrazione");		
		//CONTROLLO SE ESISTE GIA' UN FILE .XML CHE SI CHIAMA REGISTRATI
		String path = new String ("../webapps/restaurants/xml/registrati.xml");
		File file = new File(path);
		//SE IL FILE NON ESISTE LO CREO E GLI AGGIUNGO L'ELEMENTO RADICE IL PRIMO REGISTRATO
		if (!file.exists()){
			file.createNewFile();
			elementoRegistrati = new Element("registrati");
			//AGGIUNGO IL REGISTARTO CHE RISULTA IL PRIMO DATO CHE IL FILE REGISTRATI.XML NON ESISTEVA
			aggiungiRegistrato();
			//SCRIVO IL DOCUMENT NEL FILE		
			documento = new Document(elementoRegistrati);
			XMLOutputter xmlOutputter = new XMLOutputter();
			try{
   				FileOutputStream fileOutputStream = new FileOutputStream(new File(path)); 
   				xmlOutputter.output(documento, fileOutputStream);
 			}
	 		catch (FileNotFoundException ex){
   				System.err.println(ex);
 			}
	 		catch (IOException ex){
   				System.err.println(ex);
 			}
		}
		else{
			//SE IL FILE ESISTE LO CARICO IN MEMORIA
 			SAXBuilder saxBuilder = new SAXBuilder();
			try{
   				documento = saxBuilder.build(new File(path)); 
 			}
 			catch (JDOMException ex){
   				System.err.println(ex);
			}
	 		catch (IOException ex){
   				System.err.println(ex);
 			}					
			//POI UNA VOLTA CARICATO CONTROLLO CHE NON CI SIA GIA' UN REGISTRATO CON TALE LOGIN E SE NON C'è INSERISCO IL NUOVO REGISTRATO ALTRIMENTI GLI DICO DI CAMBIARE LOGIN
			elementoRegistrati = documento.getRootElement(); 
			List lista_registrati = elementoRegistrati.getChildren();
			// ottengo un iteratore alla lista chiamando il metodo iterator() di Collection (essendo una list una collection) 
 			Iterator iteratore = lista_registrati.iterator();
			while (iteratore.hasNext())
 			{ 
   				// ottengo l'elemento corrente chiamando next() sull'iteratore 
   				Element registrato_corrente = (Element)iteratore.next(); 
				String username = registrato_corrente.getAttributeValue("username");
				String password = registrato_corrente.getAttributeValue("password");
				if (password_inviata.equals(password)){
					buf.append("Password già presente, sceglierla diversamente");
					controllo = new String("ko");
					break;
				}
 			}
			if (controllo.equals("ok")){
				//RISCRIVO L'INTERO DOCUMENTO NEL FILE XML DOPO AVER AGGIUNTO IL REGISTRATO
				aggiungiRegistrato();
				XMLOutputter xmlOutputter = new XMLOutputter();
 				//IL METODO SEGUENTE Format.getPrettyFormat() SERVE PER SCRIVERE SUL FILE XML IN MODO BEN FORMATTATO CON GLI A CAPO E LE INDENTAZIONI PER OGNI ELEMENTO, MA NON ME LO ACCETTA
				//xmlOutputter.setFormat(Format.getPrettyFormat());
    				try{
   					FileOutputStream fileOutputStream = new FileOutputStream(new File(path)); 
   					xmlOutputter.output(documento, fileOutputStream);
 				}
		 		catch (FileNotFoundException ex){
   					System.err.println(ex);
 				}
		 		catch (IOException ex){
   					System.err.println(ex);
 				}
			}			
		}
		responseOutput.println(buf.toString());
		responseOutput.close();
	}
}