Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [Java] Modifica di xml

  1. #1

    Java e XML - Modifica di xml

    Ciao ragazzi!

    Sto lavorando su un java che si occupa di modificare un xml utilizzando JDOM.
    Guardate qua:
    codice:
    SAXBuilder builder = new SAXBuilder();
    
    doc = builder.build( new File(percorsoFile + nomeFile + estensioneFile) );
    
    Element datiDB = doc.getRootElement();
    
    Element main = datiDB.getChild("accesso");
    
    Element pagine = new Element("pagine");
    main.addContent(pagine);
    Questo è uno stralcio del mio java da compilare che si occupa di creare un elemeno pagine sotto "accesso".
    Io però voglio che pagine me lo creai sotto l'ultimo nodo "accesso" presente nell'xml.
    Vi posto anche uno stralcio dell'xml:
    codice:
    <?xml version="1.0" encoding="ASCII"?>
    <accessi>
    	<accesso data="2/8/2004" ora="9:45:34" ip="127.0.0.1">
    		<info>
    			<referer>http://127.0.0.1:8080/smartPress/user/home/home.jsp</referer>
    			<all>gl</all>
    		</info>
    		<pagine>
    			<pagina data="2/8/2004" ora="9:45:40">
    				<url>Rassegne</url>
    			</pagina>
    		</pagine>
    		<pagine>
    			<pagina data="2/8/2004" ora="9:45:49">
    				<url>Ricerca</url>
    			</pagina>
    		</pagine>
    	</accesso>
    	<accesso data="2/8/2004" ora="9:46:18" ip="127.0.0.1">
    		<info>
    			<referer>http://127.0.0.1:8080/smartPress/user/home/home.jsp</referer>
    			<all>gl</all>
    		</info>
    	</accesso>
    </accessi>
    In questo esempio voglio che quindi "pagine" venga aggiunto non al primo "accesso" ma al secondo, ovvero l'ultimo, "accesso".
    Qualcuno mi può aiutare?

    Grazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  2. #2
    ricordati di mettere sempre il linguaggio nel titolo
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Per fare ciò che chiedi il metodo che ho adottato io è quello di passare agli Iterator:
    codice:
    SAXBuilder builder = new SAXBuilder();
    
    doc = builder.build( new File(percorsoFile + nomeFile + estensioneFile) );
    
    Element datiDB = doc.getRootElement();
    
    Iterator i = datiDB.getChildren().iterator();
    Element el;
    while (i.hasNext()) {
       el = (Element) i.next();  // So che è un elemento di tipo "accesso"
    }
    // Ora nell'oggetto el ho memorizzato l'ultimo tag <accesso> contenuto nel XML
    
    Element pagine = new Element("pagine");
    el.addContent(pagine);
    Questo metodo, però, assume che come figli di primo livello della ROOT ci siano solamente elementi di tipo <accesso>

    Se, invece, il documento XML può contenere anche altri tipi di tag è necessario raffinare il procedimento.
    codice:
    SAXBuilder builder = new SAXBuilder();
    
    doc = builder.build( new File(percorsoFile + nomeFile + estensioneFile) );
    
    Element datiDB = doc.getRootElement();
    
    Iterator i = datiDB.getChildren().iterator();
    Element el;
    Element old;
    boolean finito = false;
    while (i.hasNext() && !finito) {
       el = (Element) i.next();  // So che è un elemento di tipo "accesso"
       if (!el.getName().equals("accesso")) {
          finito = true;
       } else {
          old = el;
       }
    }
    // Ora nell'oggetto old ho memorizzato l'ultimo tag <accesso> contenuto nel XML
    
    Element pagine = new Element("pagine");
    el.addContent(pagine);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Heilà!

    Mi va benissimo la prima soluzione perchè sono sicuro che i figli di primo livello sono solo "accesso" però Gel, il mio compilatore, continua a dirmi di non riuscire a compilare, dando errore alla riga dove parto con l'interator.
    Devo includere qualche altro pacchetto per poter utilizzare la interator?

    Grazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  5. #5
    Mi cospargo il capo di cenere e anche di qualcos'altro.
    Avevo dimenticato questa cosa..ehmm..:
    codice:
    import java.util.*;
    Grazie mille!

    Ciao!!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  6. #6
    Sono ancora qua.
    Ho utilizzato l'iterator per poter estrarre l'ultimo child "accesso" dall'xml come segue:
    codice:
    SAXBuilder builder = new SAXBuilder();
    
    doc = builder.build( new File(percorsoFile + nomeFile + estensioneFile) );
    
    Element datiDB = doc.getRootElement();
    
    Iterator i = datiDB.getChildren().iterator();
    Element ultimoAccesso;
    while (i.hasNext()) {
       ultimoAccesso = (Element) i.next();
    }
    Element pagine = ultimoAccesso.getChild("pagine");
    Element pagina = new Element("pagina");
    pagina.setAttribute("data",dataAccesso);
    pagina.setAttribute("ora",oraAccesso);
    pagine.addContent(pagina);
    Dopo aver assegnato a ultimoAccesso l'ultimo nodo "accesso", voglio andare ad aggiungere "pagina" a "pagine" che a sua volta sta all'interno dell'ultimo "accesso". Dico bene?
    Ma il listato che ho postato sopra ancora non mi funziona.
    Il compilatore mi dice che la variabile "ultimoAccesso" potrebbe non essere stata definita.
    Dove sto sbagliando?

    Rigrazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Non stai sbagliano, semplicemente Java è pignolo. Mi sono dimenticato di aggiungere una cosa nel codice che ti ho postato:
    codice:
    SAXBuilder builder = new SAXBuilder();
    
    doc = builder.build( new File(percorsoFile + nomeFile + estensioneFile) );
    
    Element datiDB = doc.getRootElement();
    
    Iterator i = datiDB.getChildren().iterator();
    Element ultimoAccesso = null; // <-- modifica!!!
    while (i.hasNext()) {
       ultimoAccesso = (Element) i.next();
    }
    Element pagine = ultimoAccesso.getChild("pagine");
    Element pagina = new Element("pagina");
    pagina.setAttribute("data",dataAccesso);
    pagina.setAttribute("ora",oraAccesso);
    pagine.addContent(pagina);
    Purtroppo, all'esterno del blocco while, l'oggetto non è inizializzato. L'inizializzazione avviene solo dentro al while che è ad un livello di annidamento diverso. Per questo basta inizializzare a null l'oggetto, altrimenti il compilatore pensa che questo oggetto possa non essere inizializzato al momento del suo utilizzo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Acc...è vero. Era mi era sfuggito.
    Comunque ora funziona alla perfezione!

    Grazie ancora!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Di nulla. Mi sono dovuto scontrare anch'io pochi giorni fa con il problema di leggere da un XML più di un blocco di dati contraddistinto dallo stesso TAG.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Io ho dovuto realizzare un bean che scrive, legge e modifica un file xml per la gestione e la consultazione di log di accessi ad un sito.
    Ero partito con xerces ma l'ho trovato piuttosto complicato.
    Poi sono passato al JDOM e l'ho trovato decisamente più comodo.
    Ed ora il mio bel bean è funzionante e già operativo online.

    Ciao!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

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.