2009-02-01 3 views
6

У меня есть простой класс Java, который выглядит примерно так:
Как легко загрузить файл конфигурации на основе XML в Java-класс?

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"; 
      ... 
} 



я хотел бы, чтобы прочитать эту информацию из простого файла XML, который выглядит примерно так:

<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> 

Есть ли простой способ вставить информацию из XML-файла непосредственно в имена переменных, вместо того, чтобы вручную ее анализировать? Я не против использовать внешнюю библиотеку.

Любая помощь приветствуется.

ответ

10

XStream - действительно отличная библиотека для этого.

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

Вы можете настроить псевдонимы для вашего класса и даже пользовательские форматы данных, чтобы сделать файл XML более читаемым.

+0

Я использую Xstream для довольно многих вещей. Мне нравится, что его легко расширить, чтобы файл выглядел так, как вы хотите. –

4

Я бы рекомендовал Apache Digester, так как если ваши классы являются фасолью, он просто обработает чтение XML в них.

5

Альтернативы уже упомянутых решений (XStream и Apache Commons Digester) будет Java собственного JAXB для сравнимого общего подхода или решения более ориентирована на конфигурацию, как Apache Commons Configuration или в Java Preferences API.

+0

+1 для настройки Commons. – Viccari

2

Вы также можете использовать Spring - хотя это может быть немного излишним для одного класса, если это для мобильной игры!

1

Использование JAXB. Он включен в JDK, начиная с Java 1.6.

2

Я недавно начал использовать Simple http://simple.sourceforge.net/ для сопоставления объектов XML. Он использует аннотации внутри класса аналогично методу, который я использую в C#, и красив и чист. Вы также можете разбить файл на несколько классов, а экономия при загрузке - это простой один лайнер.

В вашем случае будет выглядеть классная структура.

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 
}  

Примечание одна разница в том, что ваш массив будет сохранен как этот

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

Но у вас есть возможность добавления (запись = «Myname») в аннотации, в которой доносились XML будет сохраняются следующим образом:

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

Но конечный результат тот же, как только он загружается в массив.

Смежные вопросы