Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Aggiungere nodi xml con jdom

    Ciao a tutti, vengo subito al dunque.. Anche se so che il tema è stato trito e ritrito non riesco a giungere ad una soluzione.. Ebbene, sto realizzando un'applicazione java che si appoggia ad un file xml per caricare i dati che mi servono. Attraverso una form java (usando Swing, la form non è altro che un JFrame con un JPanel che contiene campi di testo e altro) vorrei aggiungere alla fine del mio file xml un nuovo elemento che contiene sottoelementi, ma non ho veramente la minima idea di come poter fare...
    Faccio un esempio per farmi capire meglio:

    <lista_libri>
    <libro>
    <titolo>titolo1</titolo>
    <autore>autore1</autore>
    </libro>
    <libro>
    <titolo>titolo2</titolo>
    <autore>autore2</autore>
    </libro>
    <libro>
    <titolo>titolo3</titolo>
    <autore>autore3</autore>
    </libro>
    </lista_libri>

    Ecco, quello che vorrei fare è aggiungere dopo l'ultimo libro un altro libro.. Come posso fare? Lo so che probabilmente è una cavolata, ma non ne vado fuori.. HELPPP


  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Aggiungere nodi xml con jdom

    Originariamente inviato da Nick083
    vorrei aggiungere alla fine del mio file xml un nuovo elemento che contiene sottoelementi
    Chiaramente prima dei aver "parsato" il file ottenendo così l'albero di nodi, secondo JDOM, che fa capo a un org.jdom.Document.

    Originariamente inviato da Nick083
    quello che vorrei fare è aggiungere dopo l'ultimo libro un altro libro..
    Non si capisce purtroppo se <lista_libri> è il tag radice. Comunque ammesso che tu riesca ad ottenere (se è il tag radice, è immediato) un Element che si riferisce a questo tag <lista_libri>, è abbastanza semplice aggiungere qualcosa:

    codice:
    Element listaLibri = ........
    
    Element libro = new Element ("libro");
    libro.addContent (new Element ("titolo").addContent ("titolo5"));
    libro.addContent (new Element ("autore").addContent ("autore5"));
    
    listaLibri.addContent (libro);
    Alla fine riscrivi tutto il Document su file con XMLOutputter.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie andbin... ho provato a fare come dici te, però non funziona.. credo ci siano problema con la scrittura perchè il file xml non viene per niente modificato... Posto il codice che ho utilizzato così da poter avere una visione più chiara:

    codice:
    Document documento = null;
                SAXBuilder saxBuilder = new SAXBuilder();
                try {
                    documento = saxBuilder.build(new File("./xml/copia_lista_processi.xml")); 
                }
                catch (JDOMException ex) {
                    System.err.println(ex);
                }
                catch (IOException ex) {
                    System.err.println(ex);
                }
                Element elementoRadice = documento.getRootElement(); 
                /*List elencoProcessi = elementoRadice.getChildren("processo");
                Iterator iteratoreProcessi = elencoProcessi.iterator();
                while (iteratoreProcessi.hasNext()) {
                     Element elementoProcesso = (Element)iteratoreProcessi.next();
                }*/
               
                Element processo = new Element ("processo");
                processo.addContent (new Element ("id").addContent (id_processo.getText()));
                processo.addContent (new Element ("nome").addContent (nome_processo.getText()));
                for (int i=0;i<criticita.length;i++){
                    if (criticita[i].isSelected()) {
                        processo.addContent (new Element ("criticita").addContent (criticita[i].getText()));
                    }
                }
                processo.addContent (new Element ("id").addContent (responsabile.getText()));
                processo.addContent (new Element ("nome").addContent (descrizione.getText()));
                for (int i=0;i<impatto.length;i++){
                    if (impatto[i].isSelected()) {
                        processo.addContent (new Element ("impatto_aziendale").addContent (impatto[i].getText()));
                    }
                }
                processo.addContent (new Element ("rto").addContent (rto.getText()));
                processo.addContent (new Element ("rpo").addContent (rpo.getText()));
                processo.addContent (new Element ("mtbf").addContent (mtbf.getText()));
                processo.addContent (new Element ("tempo_ripristino").addContent (tempo_rispristino.getText()));
                
                elementoRadice.addContent (processo);
                XMLOutputter xmlOutputter = new XMLOutputter();
                xmlOutputter.setFormat(Format.getPrettyFormat());
                try {
                   FileOutputStream fileOutputStream = new FileOutputStream(new File("copia_lista_processi.xml")); 
                   xmlOutputter.output(documento, fileOutputStream);
                 }
                 catch (FileNotFoundException ex) {
                   System.err.println(ex);
                 }
                 catch (IOException ex) {
                   System.err.println(ex);
                 }
    Ditemi se vedete qualcosa di sbagliato... Mi fareste un enorme piacere.. Thanks

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Vedi se questo articoletto può esserti utile: http://www.javastaff.com/article.php...60728205624716
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Grazie alex, ma l'avevo già letto... Purtroppo in quell'articolo si parla di come scrivere un documento xml o leggerlo, ma non parla di come aggiungere dei nuovi elementi... E comunque mi sembra di aver seguito più o meno quello, ma non funzia...

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Nick083
    Grazie alex, ma l'avevo già letto... Purtroppo in quell'articolo si parla di come scrivere un documento xml o leggerlo, ma non parla di come aggiungere dei nuovi elementi...
    Si che l'ho scritto nell'articolo

    codice:
     Element elementoTitolo = new Element("titolo"); 
     elementoTitolo.setText("Powerslave");
        
     Element elementoGruppo = new Element("gruppo"); 
     elementoGruppo.setText("Iron Maiden");
    
    
     ...
    
     elementoAlbum.addContent(elementoTitolo);
     elementoAlbum.addContent(elementoGruppo);
    
     ...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    alex e andbin... grazie mille... sono riuscito a risolvere il problema!!!! Tra l'altro, non mi aggiornava il file xml solo perchè avevo sbagliato di scrivere la destinazione.. va beh.. soliti errori del cavolo che ti fanno perdere tempo...

    ciaooooo

  8. #8
    ehm... non mandatemi a quel paese..Però come sono riuscito grazie a voi ad aggiungere un elemento al file xml, vorrei avere pure la possibilità di cancellarne uno particolare, però tanto per cambiare non ci riesco..
    Il codice è questo:

    codice:
    for (int i=0; i<processi.length; i++) {
                System.out.println ("Dentro il for, indice i="+i);
                if (processi[i].isSelected()) {
                    System.out.println ("Risulta selezionato il processo: "+processi[i].getText());
                    Document documento = null;
                    SAXBuilder saxBuilder = new SAXBuilder();
                    try {
                        documento = saxBuilder.build(new File("./xml/lista_processi.xml")); 
                    }
                    catch (JDOMException ex) {
                        System.err.println(ex);
                    }
                    catch (IOException ex) {
                        System.err.println(ex);
                    }
                    Element elementoRadice = documento.getRootElement();
                    List elencoProcessi = elementoRadice.getChildren("processo");
                    Iterator iteratoreProcessi = elencoProcessi.iterator();
                    while (iteratoreProcessi.hasNext()) {
                        Element elementoProcesso = (Element)iteratoreProcessi.next();
                        if (elementoProcesso.getChildTextTrim("id").equals(processi[i].getText())) {
                            //elemento da rimuovere trovato!
                            String stringa = elementoProcesso.getChildTextTrim("id");
                            elementoRadice.removeContent(elementoProcesso);
                            JOptionPane.showMessageDialog(this, "Il processo"+stringa+"è stato eliminato con successo.");
                        }
                    }
                    XMLOutputter xmlOutputter = new XMLOutputter();
                    xmlOutputter.setFormat(Format.getPrettyFormat());
                    try {
                       FileOutputStream fileOutputStream = new FileOutputStream(new File("./xml/lista_processi.xml")); 
                       xmlOutputter.output(documento, fileOutputStream);
                     }
                     catch (FileNotFoundException ex) {
                       System.err.println(ex);
                     }
                     catch (IOException ex) {
                       System.err.println(ex);
                     }
                }
           }
    Mi dà sempre e comunque questa eccezione:

    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at org.jdom.ContentList$FilterListIterator.checkConcu rrentModification(ContentList.java:940)
    at org.jdom.ContentList$FilterListIterator.nextIndex( ContentList.java:829)
    at org.jdom.ContentList$FilterListIterator.hasNext(Co ntentList.java:785)
    at org.jdom.ContentList$FilterListIterator.next(Conte ntList.java:792)
    at drsimulator.RemoveProcess.actionPerformed(RemovePr ocess.java:131)
    dove con la riga 131 di intende la riga del while con scritto:
    codice:
    while (iteratoreProcessi.hasNext()) {
    So che è un problema dell'iteratore pèerchè se cancello un elemento non riece più ad andare a quello prossimo, però sono bloccato...

    aiutatemi se potete... vi offro uno spritz!!!

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Nick083
    Mi dà sempre e comunque questa eccezione:

    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at org.jdom.ContentList$FilterListIterator.checkConcu rrentModification(ContentList.java:940)
    at org.jdom.ContentList$FilterListIterator.nextIndex( ContentList.java:829)
    at org.jdom.ContentList$FilterListIterator.hasNext(Co ntentList.java:785)
    at org.jdom.ContentList$FilterListIterator.next(Conte ntList.java:792)
    at drsimulator.RemoveProcess.actionPerformed(RemovePr ocess.java:131)
    dove con la riga 131 di intende la riga del while con scritto:
    codice:
    while (iteratoreProcessi.hasNext()) {
    :master:

    Usa ListIterator al posto di Iterator :master: (per ottenerlo chiama il metodo listIterator() invece di iterator()).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    alex risolto tutto... ieri evidentemente ero un po' stanco.. bastava mettere un break; all'interno del ciclo while.... grazie lo stesso!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.