Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8

    [Generico] XML - JDOM : gestione di una variabile complessa

    Ciao a tutti, premetto che è il mio primo post quindi non so se la sezione è quella giusta.
    Mi scuso in anticipo se non fosse così.

    Passo a esporre il mio problema:

    Il mio intento è quello di inserire un input dato dall'utente all'interno dei dati del task/item che sta eseguendo. Per far questo mi avvalgo di JDOM poichè sto utilizzando un sistema dotato di item/task la cui specifica è definita attraverso un proprio XML.

    Nell' XML dell'item (che sono riuscito correttamente a leggere con il codice che riporto sotto) i dati sono inseriti all'interno del tag <data></data> (anche questi sono riuscito a recuperarli con il codice riportato sotto).

    codice:
    Element wir = new SAXBuilder().build(new StringReader(itemXML)).getRootElement();
    Element data = wir.getChild("data");
    Ancora una volta, un livello sotto i dati, è posto il data tree che ho recuperato con il codice seguente:

    codice:
    Element wirData = (Element) data.getChildren().get(0);
    A questo punto, una volto letto l'input e definito il nome della variabile dell'item (in questo esempio scrivo "var") è semplice recuperare proprio quella variabile in cui scrivere il valore inserito dall'utente (Vedi codice sotto).

    codice:
     String input = request.getParameter("input")  
    Element dataitem = wirData.getChild("var");   
    dataitem.setText(input);
    Tutto questo funziona perfettamente finchè la variabile è una variabile semplice e non è del tipo complexType (Vedi esempio sotto)

    codice:
    <xs:complexType name="VariabileComplessa">     
       <xs:sequence>       
         <xs:element name="Figlio1" type="xs:string" />       
         <xs:element name="Figlio2" type="xs:string" />     
       </xs:sequence>   
     </xs:complexType>
    In questo caso si suppone che l'elemento da scrivere sia un sottoelemento della variabile complessa contenuta nei dati dell'XML e che quindi una volta ottenuta la variabile, io debba recuperare i figli e andare a scrivere in quello che mi interessa.
    Per cui avevo pensato di utilizzare il codice sottostante

    String input = request.getParameter("input") //leggo l'input
    Element dataItem = wirData.getChild("VariabileComplessa"); //leggo la variabile complessa
    Element subData = (Element) dataItem.getChildren().get(0); //ottengo i figli
    Element subData1 = subData.getChild("Figlio"); //prendo ill figlio
    subDataName.setText(input); //setto l'input dell'utente nel figlio

    Il codice sopra non funziona.
    Avevo provato anche con un codice più semplice

    String input = request.getParameter("input") //leggo l'input
    Element dataItem = wirData.getChild("VariabileComplessa"); //leggo la variabile complessa
    Element subData1 = dataItem.getChild("Figlio1"); //leggo il figlio
    subData1.setText(input); // sette l'input dell'utente nel figlo

    Ma neanche questo funziona.

    (Essendo una webApp utilizzo Tomcat; l'errore che mi riporta tomcat è il seguente:

    codice:
    Exception Details: java.lang.NullPointerException
       null
    Sarei molto grato a chiunque potesse darmi una mano.

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Ho trovato la sezione giusta (Lato Server - Programmazione) e ho riaperto il topic nell'altra sezione. Mi scuso per il disguido.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Originariamente inviato da Randa
    Ho trovato la sezione giusta (Lato Server - Programmazione) e ho riaperto il topic nell'altra sezione. Mi scuso per il disguido.
    Quando sbagli area, devi segnalare la discussione e farla spostare, non aprirne un'altra.
    Comunque sia, l'area corretta in cui avresti dovuto postare è quella dedicata specificatamente al linguaggio Java, cioè questa.

    Ho provveduto io a segnalare la discussione per lo spostamento...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Moderatore di Off Topic, Kickstarter e XML L'avatar di Sky
    Registrato dal
    Jul 2000
    residenza
    Roma
    Messaggi
    1,053
    Ero convinto che il thread fosse stato scritto su Off Topic e avevo chiuso, pardon
    Ho spostato nel forum Java come suggerito da alka
    Lo Stato deve dare ai cittadini, come diritto, ciò che la mafia dà come favore.
    Carlo Alberto dalla Chiesa

    Facebook | Twitter | Last.fm | LinkedIn | Quora

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Grazie. Aspetto allora consigli per la risoluzione del problema posto.
    Se fossero necessarie ulteriori informazioni non esitate a chiedere.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Aggiorno:

    Ho provato a leggere i descendants della variabile complessa e quindi recuperare il figlio (con il codice sottostante).

    Element dataItem = wirData.getChild("VariabileComplessa");
    Element subData = (Element) dataItem.getDescendants();
    Element subDataFiglio1 = subData.getChild("Figlio1");
    subDataFiglio1.setText(input2);

    L'errore è sempre lo stesso però.

    Ho provato a vedere se il problema fosse nel fatto che la variabile non ha effettivamente sottoelementi. Ho quindi deciso di aggiungere io il sottoelemento e l'ho settato con l'input dell'utente.
    Il codice è quello riportato sotto

    Element dataItem = wirData.getChild("VariabileComplessa");
    Element subData = new Element("Figlio1");
    dataItem.addContent(subData);
    XMLOutputter outputter = new XMLOutputter();
    outputter.output(document, new FileOutputStream(itemXML));
    subData.setText(input2);

    Di nuovo l'errore che da tomcat è sempre lo stesso.
    Non so più cosa invetarmi...

  7. #7
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Ti consiglio, dal momento che hai l'xml schema, di utilizzare jaxb invece di dom...io da quando l'ho scoperto ho dimenticato il dom!
    In pratica ti ritroverai all'interno del tuo programma delle classi java con cui puoi costruire molto semplicemente documento xml che risponda a quello schema.
    Con jaxb il tipo complesso non è nient'altro che una classe e non dovrai far altro che fare
    codice:
     tipoComplesso.setAttributo(attributo)
    per settare un suo elemento.
    La documentazione è qui http://www.oracle.com/technetwork/ar...ex-140168.html , leggila (ti basta solo la parte del marshaller e dell xjc per il tuo problema) e sarai capace di passare da classi a xml e da xml a classi in pochi secondi e in perfetta filosofia java.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Preferirei non dover cambiare libreria (più che altro perchè JDOM mi è stato vivamente consigliato, diciamo) sapresti comunque linkarmi un esempio di codice per leggere e scrivere un file XML? (In modo che possa vedere se un approccio con JAXB mi semplifichi nettamente le cose?)

    PS Ti ringrazio per la risposta.

  9. #9
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Premetto che non devi installare nè importare niente, anche l'utility è compresa nell'installazione standard di java.
    Per iniziare crei le classi, da linea di comando:
    codice:
     xjc -p <nome_package> <xml_schema>.xsd -d <directory_dove_verranno_create>
    A questo punto importi le classi nel progetto, facciamo conto che le mie stanno nel package classi.jaxb (avrò quindi fatto ad es
    xjc -p classi.jaxb mySchema.xsd -d .
    )

    Per creare un documento basta che popoli le classi che ti servono e le inserisci nella classe che rappresenta la radice del documento xml, dopodiché devi ottenere un marshaller, in questo modo:
    codice:
    JAXBContext jc; //oggetto jaxb context
    Marshaller marshaller; //oggetto marshaller
                    try {
                            jc = JAXBContext.newInstance("classi.jaxb"); //otteniamo un context dalle classi
                            marshaller = jc.createMarshaller(); //creiamo marshaller
                            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true)); //giusto per estetica settiamo a true l'opzione che formatta il documento su più linee
    Da notare che il codice sopra va fatto una tantum, dopodiché per creare un documento devi fare solo
    codice:
    marshaller.marshal(radix, outputstream); //radix è un'instanza della classe radice opportunamente popolata
    Il bello è che con marshal puoi mettere il documento dove vuoi: un file, una socket, una stringa...

    Per ottenere le classi xml popolate associate a un file xml esistente che risponde a quello schema il procedimento è molto simile, solo che ti servirà un Unmarshaller.

    Aggiungo che, chi ti ha consigliato JDom, è sicuramente ignorante di jaxb o affezionato ad approcci vecchi: a parte la facilità d'uso jaxb tiene molto in ordine il codice, infatti con JDom ogni cosa è un Element/Child e alla lunga finisci per perderti, così invece gli elementi sono espliciti e, ripeto, l'approccio è java 100%.

    Un sito riassuntivo che fa vedere l'unmarshaller e i vari modi del marshaller è:
    http://download.oracle.com/docs/cd/E...arshaller.html

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    8
    Conta che io sto facendo delle jsp, quindi le classi posso crearle direttamente nel mio documento..

    Il mio XML inoltre è messo in una variabile (ItemXML)...
    Per capirci il codice per ottenerlo è:

    Element wir = new SAXBuilder().build(new StringReader(itemXML)).getRootElement();
    Element data = wir.getChild("data");

    E poi proseguo ottenendo il data tree come scritto precendetemente..

    Diciamo che essendo l'ambito universitario mi serve soprattutto per imparare e probabilmente è meglio imparare dalle basi per poi passare ad altro. Poi non essendo un guru di java..

    In ogni caso riscontri errori nel codice che ho scritto con Jdom?

    PS sto guardando la documentazione di Jaxb ma non ci sto capendo molto xD
    Ho bisogno di esempi concreti che non riesco a trovare xD

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.