2009-02-01 8 views
6

Ich habe eine einfache Java-Klasse bekam, die etwa wie folgt aussieht:
Wie kann man einfach eine XML-basierte Konfigurationsdatei in eine Java-Klasse laden?

public class Skin implements Serializable { 

    public String scoreFontName = "TahomaBold"; 
    ... 
    public int scoreFontHeight = 20; 
    ... 
    public int blockSize = 16; 
      ... 

    public int[] nextBlockX = {205, 205, 205, 205}; 
      ... 
    public String backgroundFile = "back.bmp"; 
      ... 
} 



Ich möchte diese Informationen von einer einfachen XML-Datei lesen, die etwa wie folgt aussieht:

<xml> 
    <skin> 
     <scoreFontName>"Tahoma Bold"</scoreFontName> 
     ... 
     <scoreFontHeight>20</scoreFontHeight> 
     ... 
     <blockSize>16</blockSize> 
     ... 
     <nextBlockX> 
      <0>205</0> 
      <1>205</1> 
      <2>205</2> 
      <3>205</3> 
     <nextBlockX> 
     .... 
     <backgroundFile>"back.bmp"</backgroundFile> 
     ... 
    <skin> 
</xml> 

Gibt es eine einfache Möglichkeit, die Informationen aus der XML-Datei direkt in die Variablennamen zu injizieren, anstatt sie manuell analysieren zu müssen? Es macht mir nichts aus, eine externe Bibliothek zu benutzen.

Jede Hilfe wird geschätzt.

Antwort

10

XStream ist wirklich eine großartige Bibliothek für genau dies.

http://x-stream.github.io/

Sie können Aliase für Ihre Klasse einrichten und sogar Formate benutzerdefinierte Daten der XML-Datei besser lesbar zu machen.

+0

Ich benutze Xstream für viele Dinge. Ich mag es, dass es einfach zu erweitern ist, damit Sie die Datei so aussehen lassen, wie Sie es möchten. –

4

Ich würde eigentlich Apache Digester empfehlen, denn wenn Ihre Klassen Bohnen sind, wird es nur das Lesen der XML in ihnen behandeln.

5

Alternativen zu den bereits erwähnten Lösungen (XStream und Apache Commons Digester) wären Java eigene JAXB für eine vergleichbare allgemeine Ausrichtung oder Lösungen mehr zugeschnitten auf Konfiguration wie Apache Commons Configuration oder Java Preferences API.

+0

+1 für Commons-Konfiguration. – Viccari

2

Sie können auch Spring verwenden - obwohl es für eine Klasse ein bisschen Overkill sein kann, wenn es für ein mobiles Spiel ist!

1

Verwenden Sie JAXB. Es ist im JDK enthalten, beginnend mit Java 1.6.

2

Ich habe vor kurzem mit Simple http://simple.sourceforge.net/ für XML zu Objekt Mapping verwendet. Es verwendet Annotationen innerhalb der Klasse ähnlich der Methode, die ich in C# verwende und ist nett und sauber. Sie können die Datei auch in mehrere Klassen aufteilen und das Laden sparen ist ein einfacher Liner.

In Ihrem Fall würde die Klassenstruktur aussehen.

import org.simpleframework.xml.Element; 
import org.simpleframework.xml.Root; 

@Root (Name="skin") 
public class Skin { 

    @Element(name="scoreFontName") // name param not needed if class field is the same as the xml (element) value 
    private String scoreFontName 

    @Element 
    private int scoreFontHeight 

    @Element 
    private int blockSize 

    @ElementArray 
    private int[] nextBlockX 

    @Element  
    private String backgroundFile 

    // getters 
}  

Hinweis ein Unterschied ist, dass Ihr Array wie diese

<nextBlockX> 
    <int>205</int> 
    <int>205</int> 
    <int>205</int> 
    <int>205</int> 
<nextBlockX> 

gespeichert werden, aber Sie haben Sie die Möglichkeit des Hinzufügens (Eintrag = „myName“), um die Anmerkung in dem die XML getretene so gespeichert

<nextBlockX> 
    <myName>205</myName> 
    <myName>205</myName> 
    <myName>205</myName> 
    <myName>205</myName> 
<nextBlockX> 

Aber das Endergebnis ist das gleiche, sobald es in das Array geladen ist.