Как легко загрузить файл конфигурации на основе XML в класс Java? - PullRequest
6 голосов
/ 01 февраля 2009

У меня есть простой класс 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-файла непосредственно в имена переменных, а не анализировать ее вручную? Я не против использования внешней библиотеки.

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

Ответы [ 6 ]

10 голосов
/ 01 февраля 2009

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

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

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

5 голосов
/ 01 февраля 2009

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

4 голосов
/ 01 февраля 2009

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

2 голосов
/ 16 января 2014

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

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

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>

Но у вас есть возможность добавить (entry = "myName") к аннотации, в которой XML-файл будет сохранен, как это

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

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

2 голосов
/ 02 февраля 2009

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

1 голос
/ 24 декабря 2013

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

...