Creare file XML in Java con JAXB
In ambito Java, le API più conosciute per la manipolazione dei file XML sono sicuramente SAX e DOM.
A queste possiamo aggiungere JAXB (Java Architecture for XML Binding), che ha un approccio ancora differente.
Quale sia meglio tra le tre possibilità, penso dipenda soprattutto da quello che si vuole ottenere.
Comunque con JAXB mi ci sono trovato bene, ed oggi ne vediamo un esempio.
Prima di tutto creiamo una classe che farà da "scheletro" per la struttura del file XML:
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "books")
public class Libri {
ArrayList listaLibri;
public void setListaLibri(ArrayList book) {
this.listaLibri = book;
}
@XmlElement(name = "book")
public ArrayList getListaLibri() {
return listaLibri;
}
}
Poi creiamo una classe che rappresenta ogni singolo record (un Libro in questo caso):
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "book")
public class Libro {
private int id;
private String title;
private String author;
private String editor;
private String isbn;
private double price;
private String note;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getEditor() {
return editor;
}
public void setEditor(String editor) {
this.editor = editor;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
In entrambi i casi notate le annotazioni.
Infine la classe che si preoccupa di creare effettivamente il file:
import java.io.File;
import java.util.ArrayList;
import javax.swing.JTable;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class ExportXml {
public void createXml(JTable table, File file) throws JAXBException {
ArrayList bookList = new ArrayList<>();
for (int row = 0; row < table.getRowCount(); row++) {
Libro bookModel = new Libro();
for (int column = 0; column < table.getColumnCount(); column++) {
bookModel.setId(Integer.parseInt(table.getValueAt(row, 0).toString()));
bookModel.setTitle(table.getValueAt(row, 1).toString());
bookModel.setAuthor(table.getValueAt(row, 2).toString());
bookModel.setEditor(table.getValueAt(row, 3).toString());
bookModel.setPrice(Double.parseDouble(table.getValueAt(row, 4).toString()));
bookModel.setIsbn(table.getValueAt(row, 5).toString());
bookModel.setNote(table.getValueAt(row, 6).toString());
}
bookList.add(bookModel);
}
Libri books = new Libri();
books.setListaLibri(bookList);
JAXBContext context = JAXBContext.newInstance(Libri.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(books, file);
}
}
In questo caso, i dati li prendiamo da una JTable che passiamo al metodo createXml (l'esempio è preso da un programma che uso regolarmente).
Qui creiamo un ArrayList ciclando su righe e colonne della JTable.
Poi creiamo un oggetto Libri, che rappresenta la vera lista, che poi passiamo all'istanza di JAXBContext.
Infine facciamo il Marhsaller e creaimo il file.
Questo tipo di approccio mi piace molto.
Enjoy!
java jaxb jaxbcontext xml sax dom marhsaller jtable
1 Commenti
Buon giorno ho visto questo post e volevo chiederle siccome sto facendo un gioco in cui cè un player che si può muovere e si devono prendere delle brutte che cadono e ognuna conferisce dei punti al punteggio totale, io vorrei fare una lista dei record con un file .xml come potrei fare ?
15/07/2015