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

Discussione: Classe Dom4j

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    13

    Classe Dom4j

    Sto usando la classe DOM per scrivere in un file XML, prendo in campi da un form e li scrivo nel file XML ecco il codice:

    try {

    //Creo un nuovo documento;
    org.dom4j.Document document = DocumentHelper.createDocument();

    //Creo un nuovo books;
    Element booksElement = document.addElement("rss");
    Element bookElement = booksElement.addElement("channel");

    Element authorElement;

    //Recupero il campo titolo;
    authorElement = bookElement.addElement("title");
    authorElement.addText(request.getParameter("title" ));

    //Recupero il campo descrizione;
    authorElement = bookElement.addElement("description");
    authorElement.addText(request.getParameter("descri ption"));

    //Recupero il campo link;
    authorElement = bookElement.addElement("link");
    authorElement.addText(request.getParameter("link") );

    //Recupero il campo autore;
    authorElement = bookElement.addElement("author");
    authorElement.addText(request.getParameter("author "));

    XMLWriter writer = new XMLWriter(new FileWriter("C:/rss.xml"));
    writer.write(document);
    writer.close();

    } catch (Exception e) {
    System.err.println(e);


    Il file xml viene scritto e compilato correttamente, ecco il risultato:

    <?xml version="1.0" encoding="UTF-8"?>
    <rss>
    <channel>
    <title>Titolo Mio</title>
    <description>Descrizione Mia</description>
    <link>rss/rss.xml</link>
    <author>Nemesis87</author>
    </channel>
    </rss>

    però se vado a inserire un'altra cosa nel file xml, mi va a sostituire quello che c'era già, io invece vorrei che me lo aggiungesse sotto così:


    <?xml version="1.0" encoding="UTF-8"?>
    <rss>
    <channel>

    <title>Titolo Mio</title>
    <description>Descrizione Mia</description>
    <link>rss/rss.xml</link>
    <author>Nemesis87</author>

    <title>Titolo Mio</title>
    <description>Descrizione Mia</description>
    <link>rss/rss.xml</link>
    <author>Nemesis87</author>

    </channel>
    </rss>

    in più vorrei aggiungere il tag item alla fine di ogni cosa che aggiungo così:

    <?xml version="1.0" encoding="UTF-8"?>
    <rss>
    <channel>

    <item>
    <title>Titolo Mio</title>
    <description>Descrizione Mia</description>
    <link>rss/rss.xml</link>
    <author>Nemesis87</author>
    </item>

    <item>
    <title>Titolo Mio</title>
    <description>Descrizione Mia</description>
    <link>rss/rss.xml</link>
    <author>Nemesis87</author>
    </item>

    </channel>
    </rss>

    potete aiutarmi? grazie mille^^

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

    Re: Classe Dom4j

    Originariamente inviato da Nemesi87
    però se vado a inserire un'altra cosa nel file xml, mi va a sostituire quello che c'era già, io invece vorrei che me lo aggiungesse sotto
    Allora lo dico una volta per tutte. Volendo continuare a sfruttare l'approccio DOM, dovresti:
    1) riparsare il documento, quindi ottenere un org.dom4j.Document
    2) aggiungere il o gli elementi nel punto giusto del documento
    3) riscrivere tutto il Document come hai già fatto con XMLWriter

    Ti è finalmente chiaro?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    13

    ...

    Ci sono riuscito...
    Sia a scrivere che a modificare. Un problema solo..

    Questo è il crea xml:

    qui mi creo i tag principali che devono essere all'inizio del file xml

    Element root = new Element("rss");
    Element rootDue = new Element("channel");

    e qui li aggiunto

    rootDue.addContent(initParam);
    root.addContent(rootDue);


    poi mo sposto nel modifica .xml... e ovviamente aggiungendo qualcosa di nuovo nel file xml, il tag rss deve sempre essere all'inizio del file xml e alla fine del file xml così anche channel..quindi Istanzio un oggetto Element prendendo il riferimento ad un supertag già esistente cioè rss:

    Element root = documento.getRootElement();

    se volessi però prendere in riferimento anche il tag channel come faccio?

    se faccio

    Element rootDue = documento.getRootElement(); e poi aggiungo:

    rootDue.addContent(initParam);
    root.addContent(rootDue);

    non succede proprio nulla...

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

    Re: ...

    Originariamente inviato da Nemesi87
    se volessi però prendere in riferimento anche il tag channel come faccio?
    Vedi il mio esempio DOM4JAppendElement.java tra i miei Java Examples, sezione XML.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    26

    ...

    si ma io già l'ho usato il getRootElement, mi permette di prendere però soltanto la radice principale. Se invece ho due radici? facendo:

    Element graphicsElement = document.getRootElement();
    Element graphicsElement2 = document.getRootElement(); non succede nulla...

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

    Re: ...

    Originariamente inviato da pupys87
    Se invece ho due radici?
    Ma che stai dicendo???!! Non esistono 2 radici .... in un document XML di radice ce n'è 1 sola!

    codice:
    Element graphicsElement = document.getRootElement();
    Element graphicsElement2 = document.getRootElement(); non succede nulla...
    E allora? Non capisco cosa intendi dire con questo. getRootElement() ti fornisce l'elemento "radice". Se vuoi "navigare" più dentro nell'albero usa i metodi di Element su quell'oggetto per "scoprire" altri nodi e così via ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    13

    ...

    Allora, nel crea XML...mi creo la radice che si chiama rss, , se scrivo altro voglio ovviamente che il tag "rss", sia sempre alla fine del file xml, così vorrei anche un altro tag sempre alla fine del file xml, prima del tag rss, allora faccio così:

    //Istanzio un oggetto Element, passandogli la stringa che sarà il tag "rss" e "channel";

    Element root = new Element("rss");
    Element rootDue = new Element("channel");

    Document documento = new Document(root);


    //Istanzio altri oggetti per scrivere altri tag;
    Element title = new Element("title");
    Element description = new Element("description");
    Element link = new Element("link");

    //recupero dal form;
    title.addContent(request.getParameter("title"));
    description.addContent(request.getParameter("descr iption"));
    ink.addContent(request.getParameter("link"));


    //LI aggiungo
    rootDue.addContent(initTitolo);
    initParam.addContent(title);
    initParam.addContent(description);
    initParam.addContent(link);


    //Aggiungo i tag al supertag "rss";
    rootDue.addContent(initParam);
    root.addContent(rootDue);


    poi vado all'aggiungo altro nel file xml;

    istanzio l'oggetto SAXBuilder per parsare il file xml,

    if (documento != null) {

    //Istanzio un oggetto Element prendendo il riferimento ad un supertag già esistente;

    //Istanzio altri oggetti Element passandogli le stringhe che contengono i nomi dei tag;
    Element initParam = new Element("item");


    Element title = new Element("title");
    Element description = new Element("description");
    Element link = new Element("link");

    title.addContent(request.getParameter("title"));
    description.addContent(request.getParameter("descr iption"));
    link.addContent(request.getParameter("link"));

    initParam.addContent(title);
    initParam.addContent(description);
    initParam.addContent(link);


    root.addContent(initParam);

    in questo modo anche se aggiungo altro nel file xml. il tag rss sarà sempre alla fine. Se volessi mettere alla fine anche tag channel come ho fato nel crea xml come devo fare?

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

    Re: ...

    Originariamente inviato da Nemesi87
    in questo modo anche se aggiungo altro nel file xml. il tag rss sarà sempre alla fine. Se volessi mettere alla fine anche tag channel come ho fato nel crea xml come devo fare?
    Scusa ma continuo a non capire il tuo dubbio .... Hai guardato il mio esempio? Se non ti è chiaro quello ..... non so.


    Hai parsato il file e ottenuto un org.dom4j.Document??

    Bene

    Hai ottenuto dal Document il Element della radice?? (che è <rss> nel tuo caso)

    Bene

    Con il Element della radice vai a cercare il primo (e unico) figlio contenuto (che è <channel> nel tuo caso), quindi:

    Element channelElem = rootRssElem.element("channel");

    Crei e aggiungi (nello stesso momento) un nuovo elemento per il nuovo <item> quindi:

    Element newItemElement = channelElem.addElement("item");

    In newItemElement ci aggiungi tutto il resto (i vari <title>, <description> ecc....) allo stesso modo.

    Alla fine riscrivi il Document su file.

    Che cosa non ti è chiaro di tutti questi semplici passaggi???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    13

    ...

    Boh, a me non è chiaro.

    Element root = documento.getRootElement();

    mi prendo la radice che sarebbe il tag rss, il tag channel non ho ben capito come andarmelo a prendere... ti posto tutto il codice o meglio le parti che interessato:

    scrivo nel file xml:

    //Istanzio un oggetto Element, passandogli la stringa che sarà il tag "rss" e "channel";
    Element root = new Element("rss");
    Element rootDue = new Element("channel");

    Element initTitolo = new Element("title");
    initTitolo.addContent("SummerSchool");


    Document documento = new Document(root);

    //Istanzio altri oggetti Element passando gli altri tag;
    Element initParam = new Element("item");
    Element title = new Element("title");
    Element description = new Element("description");
    Element link = new Element("link");
    Element author = new Element("author");

    //Recupero i campi dal FORM;
    title.addContent(request.getParameter("title"));
    description.addContent(request.getParameter("descr iption"));
    link.addContent(request.getParameter("link"));
    author.addContent(request.getParameter("author"));

    rootDue.addContent(initTitolo);
    initParam.addContent(title);
    initParam.addContent(description);
    initParam.addContent(link);
    initParam.addContent(author);

    //Aggiungo i tag al supertag "rss";
    rootDue.addContent(initParam);
    root.addContent(rootDue);




    //modifico il file xml;

    f (documento != null) {

    //Istanzio un oggetto Element prendendo il riferimento ad un supertag già esistente;

    Element root = documento.getRootElement();
    //Element rootDue = root.getChild(root);
    //Element rootDue = documento.getRootElement();

    //Istanzio altri oggetti Element passandogli le stringhe che contengono i nomi dei tag;
    Element initParam = new Element("item");


    Element title = new Element("title");
    Element description = new Element("description");
    Element link = new Element("link");
    Element author = new Element("author");


    title.addContent(request.getParameter("title"));
    description.addContent(request.getParameter("descr iption"));
    link.addContent(request.getParameter("link"));
    author.addContent(request.getParameter("author"));

    initParam.addContent(title);
    initParam.addContent(description);
    initParam.addContent(link);
    initParam.addContent(author);

    //rootDue.addContent(initParam);
    //root.addContent(rootDue);
    root.addContent(initParam);


    con Element root = documento.getRootElement(); prendo il riferimento del tag rss, e per il tag channel?

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

    Re: ...

    Originariamente inviato da Nemesi87
    Boh, a me non è chiaro.

    il tag channel non ho ben capito come andarmelo a prendere
    codice:
    Element root = documento.getRootElement();         // Prende la radice (<rss>)
    Element channelElem = root.element("channel");     // Cerca il primo (unico nel tuo caso) tag figlio <channel>
    
    Element itemElement = channelElem.addElement("item");      // Aggiunge un <item> dentro <channel>
    Element titleElement = itemElement.addElement("title");    // Aggiunge un <title> dentro <item>
    titleElement.addText(tuoTitolo);                           // Aggiunge del testo in <title>
    .....
    Ripeto ancora una volta: questi sono semplici passaggi ... che cosa non ti è chiaro?


    E tieni presente che in DOM4J non puoi fare cose del tipo: new Element(.....);. Non puoi istanziare un Element .... perché è una interfaccia!
    Gli Element e in generale gli altri tipi di nodi non li istanzi tu. Devi chiederli a oggetti che hai già (es. hai un Element e chiedi con addElement(nome) di aggiungerci dentro un nuovo Element) oppure tramite le classi DocumentFactory/DocumentHelper perché fanno loro da "factory".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.