Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Appendere Nodo a XML

  1. #1

    Appendere Nodo a XML

    Ho un file XML con questa struttura:

    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE commenti SYSTEM "commenti.dtd">
    <commenti>
        <commento title="Titolo 1">
            <utente>Utente 1</utente>
            <testo>Commento di Utente 1</testo>
        </commento>
    </commenti>
    Questa classe dovrebbe occuparsi di aprire il file XML, modificarlo aggiungendo un nodo
    commento e scrivere le modifiche sul medesimo file.

    codice:
    public class XMLHandler {
    
        private Document document;
    
        public Document openXML(String path) {
    
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(true);
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();
                document = builder.parse(new File(path));
            } catch (ParserConfigurationException pce) {
            } catch (SAXException se) {
            } catch (IOException ioe) {
            }
    
            return document;
        }
    
        private void writeXML(String path) {
    
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            try {
                Transformer transformer = transformerFactory.newTransformer();
                transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "commenti.dtd");
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.transform(
                        new DOMSource(document),
                        new StreamResult(new FileOutputStream(path)));
            } catch (TransformerConfigurationException tce) {
            } catch (TransformerException te) {
            } catch (FileNotFoundException fnfe) {
            }
        }
    
        public void addComment(String path, String user, String content) {
    
            document = openXML(path);
            // Creo gli elementi che costituiscono la struttura del documento XML
            Element commento = document.createElement("commento");
            Attr title = document.createAttribute("title");
            Element utente = document.createElement("utente");
            Element testo = document.createElement("testo");
    
            // Appendo il nome dall'utente, passato come parametro al metodo
            utente.appendChild(document.createTextNode(user));
            // Appendo il messaggio scritto dall'utente, passato come parametro al metodo
            testo.appendChild(document.createTextNode(content));
    
            // Appendo l'attributo title al commento
            title.setValue("Titolo di prova");
            commento.setAttributeNode(title);
    
            // Appendo i nodi child
            commento.appendChild(utente);
            commento.appendChild(testo);
    
            // Scrivo il documento XML
            writeXML(path);
    
        }
    Il documento viene correttamente aperto e riscritto integralmente (non ricevo eccezioni e la data di modifica del file si aggiorna ogni volta), tuttavia non viene aggiunto alcun nodo commento, il contenuto del document viene lasciato inalterato.
    Qualche idea? Grazie.

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

    Re: Appendere Nodo a XML

    Originariamente inviato da ^EvAmPiReS^
    tuttavia non viene aggiunto alcun nodo commento, il contenuto del document viene lasciato inalterato.
    Infatti io non vedo nel tuo codice dove dal Document prendi il root element (che sarebbe il tuo <commenti> ) con getDocumentElement() e a cui appendi il nuovo Element <commento>.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Ho tamponato la svista con:

    codice:
    // Prendo la radice commenti
    Element root = document.getDocumentElement();
    // Appendo alla radice del documento il nuovo commento
    root.appendChild(commento);
    Ora appende correttamente il commento, solo che ho dei problemi:

    1. Non mi identa correttamente l'XML (è possibile immettere i tabs?)
    2. Non riconosce la codifica UTF-8 (immetto il commento da una textarea)
    3. Non aggiorna il file del progetto, bensì quello dentro la cartella build (ma forse questo è normale)

    Risultato:

    <commento title="Prova">
    <utente>Mario Rossi</utente>
    <testo>Ciao, è una bella giornata.</testo>
    </commento>
    </commenti>

    P.S. Di fatto sta riscrivendo da capo tutto il document? Non c'è modo di appendere il
    commento e basta? Sto pensando a cosa possa succedere per grandi file con molti
    commenti.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ^EvAmPiReS^
    codice:
    // Prendo la radice commenti
    Element root = document.getDocumentElement();
    // Appendo alla radice del documento il nuovo commento
    root.appendChild(commento);
    Sì, proprio questo è quello da fare.

    Originariamente inviato da ^EvAmPiReS^
    1. Non mi identa correttamente l'XML (è possibile immettere i tabs?)
    Altre API dedicate a XML come ad esempio la libreria JDOM offrono la possibilità di specificare delle opzioni per formattare in modo appropriato/gradevole il documento.

    Ma il succo, anche con un'altra API qualunque per XML che non offre opzioni di "abbellimento" del documento, è comunque molto semplice: spazi e newline sono semplicemente contenuti in nodi di "testo" (con il DOM W3C è un org.w3c.dom.Text).

    Vuoi che dopo <commento> ci sia un newline e poi 8 spazi prima di <utente> ?? Bene allora il primo figlio di <commento> non sarà il Element <utente> ma un text node che contiene newline \n e 8 spazi.
    Ma in questo caso con le API di JAXP (Transformer ecc...) devi farlo tu.

    Originariamente inviato da ^EvAmPiReS^
    2. Non riconosce la codifica UTF-8 (immetto il commento da una textarea)
    Il fatto della textarea non centra nulla. In Java i caratteri sono char (16 bit) che essendo in UTF-16 possono rappresentare qualunque code point Unicode.

    Se proprio uno vuole specificare esplicitamente un encoding, lo si può fare impostando una apposita property al Transformer.

    Originariamente inviato da ^EvAmPiReS^
    3. Non aggiorna il file del progetto, bensì quello dentro la cartella build (ma forse questo è normale)
    Beh, è solo questione di vedere quale path hai usato, se "assoluto" o se "relativo" e in quest'ultimo caso sarebbe relativo alla directory "corrente" e quale sia .... beh, dipende da come/da dove è stata avviata la applicazione.

    Originariamente inviato da ^EvAmPiReS^
    <testo>Ciao, è una bella giornata.</testo>
    Ma infatti questo è UTF-8. Quella sequenza è sono 2 byte che rapresentano in UTF-8 il code point U+00E8 cioè proprio una "è". Se tu lo hai guardato con un editor che non usa UTF-8 ... beh, chiaro che non vedi la "è". Apri il documento con un browser (IE, FF ecc...) o con un text editor impostato per UTF-8.

    Originariamente inviato da ^EvAmPiReS^
    Non c'è modo di appendere il commento e basta?
    Con queste API no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Credo che soprassiederò sull'identazione

    In effetti ho aperto con notepad++ ma non credo abbia l'UTF-8 attivato,
    comunque avevo impostato la proprietà di cui parli (adesso non ricordo il codice)
    insieme a "INDENT", "Yes".

    Per accedere alla risorsa XML ho usato (tra l'altro spulciando un topic con una tua risposta )

    codice:
    String path = getServletContext().getRealPath("xml/commenti.xml");
    Credo NetBeans prenda come radice delle risorse la cartella build, dove ha
    le robe compilate

    codice:
    finally { System.out.println("Grazie andbin! Sei un'inesauribile fonte di conoscenza."); }
    Torno a studiale valà...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ^EvAmPiReS^
    Credo che soprassiederò sull'identazione
    Oppure ... usi JDOM o altra API che offre opzioni di "abbellimento"/formattazione del documento.

    Originariamente inviato da ^EvAmPiReS^
    codice:
    String path = getServletContext().getRealPath("xml/commenti.xml");
    Tecnicamente corretto. Il path che passi è relativo alla context-root, quindi non centra la directory del progetto in NetBeans o dove hai i sorgenti o la "build" o altro. Centra proprio solo il path che il servlet container (es. Tomcat) usa come context-root della tua webapp.
    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.