Sascha's Wiki

XML Dateien mit JAXB erstellen und auslesen

Hier wird das Verwenden eines XML Schemas, dem erzeugen einer Java Klasse sowie dem lesen und schreiben mit Hilfe dieser gezeigt. Ich verwende zur Erklärung in hier die advancedsettings.xml als Beispiel.

Das XML Schema

<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
    
    <xsd:annotation>
        <xsd:documentation xml:lang="de">
            advancedsettings.xml for MySQL Database connection
        </xsd:documentation>
    </xsd:annotation>
    
    <xsd:element name="advancedsettings">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="videodatabase" type="settings"/>
                <xsd:element name="musicdatabase" type="settings"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="settings">
        <xsd:sequence>
            <xsd:element name="host" type="xsd:string"/>
            <xsd:element name="type" type="xsd:string"/>
            <xsd:element name="port" type="xsd:int"/>
            <xsd:element name="user" type="xsd:string"/>
            <xsd:element name="pass" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Um sich das erzeugen der Schemadatei zu erleichtern kann man den Generator auf dieser Seite verwenden. Außerdem ist der Schemagenerator der Netbeans IDE sehr gut für das Erzeugen geeignet.

Binding

Wenn man die JDK in seinen Windows Umgebungsvariablen hat kann man mit nachfolgendem Befehl einfach aus einer Schemadatei eine Java Klasse generieren lassen.

~\Path\zu\JDK\bin\xjc -d Zielverzeichnis \Pfad\zur\Schemadatei.xsd
Wichtig das Zielverzeichnis muss bereits existieren da es durch xjc nicht erstellt wird

Durch die Befehlszeile wurde ein Ordner generated im gewünschten Verzeichnis erstellt. Dieser enthält die Klassen

  • ObjectFactory.java
  • Advancedsettings.java
  • Settings.java

XML File schreiben

import generated.Advancedsettings;
import generated.ObjectFactory;
import generated.Settings;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.PropertyException;

public class WriteXML

    //Variablen
    private String host = "";
    private String user = "";
    private String pass = "";
    private int port = 3306;
    private String type = "MySQL";
    private File projectDirectory;
    private String filePath = "";
    
    //Methode zum setzen der Variablen
    public void setValues(String host, int port, String user, String pass) {
        this.host = host;
        this.port = port;
        this.pass = pass;
        this.user = user;
    }

    //JFileChooser zur Auswahl des Pfades öffnen
    public void openChooser() throws PropertyException, JAXBException {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int state = chooser.showOpenDialog(null);
        if (state == JFileChooser.APPROVE_OPTION) {
            projectDirectory = chooser.getSelectedFile();
        }
        String directoryPath = projectDirectory.getAbsolutePath();
        filePath = directoryPath + System.getProperty("file.separator")
                + "advancedsettings.xml";
        writeFile();

    }

    //Methode zum schreiben des Files
    private void writeFile() throws PropertyException, JAXBException {
        //Neues File erzeugen
        File file = new File(filePath);
        //Überprüfen ob File bereits existiert und ggf. überschreiben
        if (file.exists()) {
            int optionPane = JOptionPane.showConfirmDialog(
                    null,
                    "File already exist!\n"
                    + "Do you want to overwrite it?");
            if (optionPane == JOptionPane.NO_OPTION) {
                openChooser();
                return;
            } else if (optionPane == JOptionPane.CANCEL_OPTION) {
                return;
            }
        }

        //Erzeugen der Factory des Avancedsettingsobjekts und der "Datenbanken"
        ObjectFactory objectFactory = new ObjectFactory();
        Advancedsettings settings = objectFactory.createAdvancedsettings();
        Settings mSettings = objectFactory.createSettings();
        Settings vSettings = objectFactory.createSettings();

        //Settings den zugehörigen Datenbanken zuweisen
        settings.setMusicdatabase(mSettings);
        settings.setVideodatabase(vSettings);
        
        //Daten Setzen
        settings.getMusicdatabase().setHost(this.host);
        settings.getMusicdatabase().setPass(this.pass);
        settings.getMusicdatabase().setPort(this.port);
        settings.getMusicdatabase().setType(this.type);
        settings.getMusicdatabase().setUser(this.user);

        settings.getVideodatabase().setHost(this.host);
        settings.getVideodatabase().setPass(this.pass);
        settings.getVideodatabase().setPort(this.port);
        settings.getVideodatabase().setType(this.type);
        settings.getVideodatabase().setUser(this.user);

        //Marshaller erzeugen und File schreiben
        Marshaller marshaller = JAXBContext.newInstance("generated").createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        marshaller.marshal(settings, file);
        msg();
    }

    //Methode zum anzeigen einer Klasse
    private void msg() {
        JOptionPane.showMessageDialog(null,
                "File Written to: " + filePath);
    }
}

Von XML File lesen

Um von einem XML File zu lesen bietet es sich an, das gleiche Schema wie beim erstellen zu verwenden. Beim einzulesenden File muss sichergestellt sein dass im <?xml ?> Bereich encoding ausgefüllt ist. Man muss bei der Netbeans IDE nur ein neues JAXB Binding hinzufügen. Dort wählt man die Gewünschte Schemadatei aus und lässt sich so die Java Klassen erzeugen. Im Unteren wird gezeigt wie man aus dem File ein Objekt erzeugt.

public static void main(String[] args) throws JAXBException {
        final File file = new File("C:\\temp\\analyse.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        JAXBElement unmarshal = (JAXBElement) unmarshaller.unmarshal(file);
}

java/netbeans/jaxb.txt · Zuletzt geändert: 2016/04/21 09:15 (Externe Bearbeitung)