Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Usare JAXB

  1. #1

    Usare JAXB

    Ciao a tutti,
    ho scoperto da poco JAXB e vorrei capire se fa al caso mio.
    Dovrei trasformare in file txt in un file XML, vedendo qualche esempio di JAXB mi sono accorta che se implementassi una classe con gli elementi che devono essere contenuti nel mio file XML riuscirei ad ottenere il file che voglio, se non è corretto indicatemi cortesemente la strada giusta.

    Per cui ho creato la mia classe Elemento che contiene le proprietà autore e titolo, e sui metodi set ho idicato le annotazioni. Ho creato la classe seguente per poter avere il file XML

    codice:
        public void Prova() {
            try {
                File f = new File("C:\\prova.txt");
                in = new BufferedReader(new FileReader(f));
                Elemento elemento = new Elemento();
    
                String str;
                while ((str = in.readLine()) != null) {
                    process(str, elemento);
                }
                p(elemento);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void process(String s, Elemento documento) {
            String[] tokens = s.split(";");
            documento.setNomeAutore(tokens[0]);
            documento.setTitolo(tokens[1]);
        }
    
        public void p(Elemento doc) {
            try {
    
                File file = new File("C:\\file.xml");
                JAXBContext jaxbContext = JAXBContext.newInstance(Elemento.class);
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    
                // output pretty printed
                jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
                jaxbMarshaller.marshal(doc, file);
                jaxbMarshaller.marshal(doc, System.out);
    
            } catch (JAXBException e) {
                e.printStackTrace();
            }
    
        }
    Il codice non ha errori, quindi viene eseguito correttamente, ma in realtà non mi genera quello che cercavo, in pratica nel mio documento di partenza ho un file txt con più righe e vorrei che generare il file xml con tutte le righe presenti nel txt, ma non riesco a farlo; il codice che vi sottopongo genera il file xml ma solo dell'ultima riga del file originario txt.
    Qualcuno saprebbe darmi una mano?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gattamelogna Visualizza il messaggio
    Qualcuno saprebbe darmi una mano?
    Nel tuo codice ci sono diverse cose che non vanno ... anche concettuali. Ad esempio, tanto per dirne due, stai modificando i dati sempre dello stesso identico oggetto Elemento e comunque non stai gestendo una "lista" dei tuoi elementi.

    Prendi spunto da quanto segue che ho scritto al volo:

    codice:
    import java.util.List;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlElement;
    
    @XmlRootElement
    public class Libri {
        private List<Libro> listaLibri;
    
        @XmlElement(name="libro")
        public List<Libro> getListaLibri() {
            return listaLibri;
        }
    
        public void setListaLibri(List<Libro> listaLibri) {
            this.listaLibri = listaLibri;
        }
    }

    codice:
    public class Libro {
        private String titolo;
        private String editore;
    
        public Libro(String titolo, String editore) {
            this.titolo = titolo;
            this.editore = editore;
        }
    
        // getTitolo() / setTitolo(String titolo) / getEditore() / setEditore(String editore)
        // omessi per brevità .....
    }

    codice:
    import java.io.*;
    import java.util.*;
    import javax.xml.bind.*;
    
    public class ProvaLibri {
        public static void main(String[] args) {
            try {
                List<Libro> listaLibri = new ArrayList<Libro>();
    
                listaLibri.add(new Libro("Ant in Action", "Manning"));
                listaLibri.add(new Libro("Java I/O, Second Edition", "O'Reilly"));
    
                Libri libri = new Libri();
                libri.setListaLibri(listaLibri);
    
                JAXBContext context = JAXBContext.newInstance(Libri.class);
                Marshaller marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
                marshaller.marshal(libri, new File("libri.xml"));
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }

    File libri.xml generato:

    codice:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <libri>
        <libro>
            <editore>Manning</editore>
            <titolo>Ant in Action</titolo>
        </libro>
        <libro>
            <editore>O'Reilly</editore>
            <titolo>Java I/O, Second Edition</titolo>
        </libro>
    </libri>
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la risposta, attualmente ho questo codice
    La classe Documento che contiene una lista di Elementi
    codice:
    @XmlRootElement
    public class Documento {
        
        private List<Elemento> elemento = new ArrayList<Elemento>();
    
        @XmlElement(name="elemento")
        public List<Elemento> getListaElementi() {
            return elemento;
        }
    
        public void setListaElementi(List<Elemento> listaElementi) {
            this.elemento = listaElementi;
        }

    Una classe Elemento
    codice:
    public class Elemento {
    
        private String nomeAutore;
        private String titolo;
    
        
        public String getNomeAutore() {
            return nomeAutore;
        }
    
        @XmlElement
        public void setNomeAutore(String nomeAutore) {
            this.nomeAutore = nomeAutore;
        }
    
        public String getTitolo() {
            return titolo;
        }
    
        @XmlElement
        public void setTitolo(String titolo) {
            this.titolo = titolo;
        }

    ed una classe che mi permette di creare il file xml
    codice:
    public void Prova() {
            try {
                documento = new Documento();
                            
                File f = new File("C:\\prova.txt");
                in = new BufferedReader(new FileReader(f));
    
                String str;
                while ((str = in.readLine()) != null) {
                    elemento = new Elemento();
                    process(str, elemento);
                    
                }
                p(documento);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void process(String s, Elemento elemento) {
            String[] tokens = s.split(";");
            elemento.setNomeAutore(tokens[0]);
            elemento.setTitolo(tokens[1]);
            documento.getListaElementi().add(elemento);
        }
    
        public void p(Documento doc) {
            try {
    
                File file = new File("C:\\file.xml");
                
                
                JAXBContext jaxbContext = JAXBContext.newInstance(Documento.class);
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    
                // output pretty printed
                jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
                jaxbMarshaller.marshal(doc, file);
                jaxbMarshaller.marshal(doc, System.out);
    
            } catch (JAXBException e) {
                e.printStackTrace();
            }
    
        }
    In questo modo mi genera il file xml in modo corretto, quindi riesco a vedere tutti i libri, se il file di input è di tipo txt.
    Se ci sono altri errori indicatemeli pure.
    Grazie ancora
    Ultima modifica di gattamelogna; 23-01-2015 a 14:58

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gattamelogna Visualizza il messaggio
    Avrei necessità di leggere non solo txt ma anche file di tipo File
    Che vuol dire!? Il file che stai trattando è "di testo puro", strutturato a "record per righe", con campi separati da ';'. Questo deve essere il formato. Poi che il file di input si chiami pippo.txt oppure pluto.dat o paperino.conf ha poca/nulla importanza per il codice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Si il file che devo trattare è strutturato in righe e con campi separati da ';', nel rispondere ho formulato in modo non corretto la frase.
    Il codice funziona, grazie per i suggerimenti.
    Ciao

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.