如何轻松地将基于XML的配置文件加载到Java类?

时间:2009-02-01 18:35:01

标签: java xml code-injection

我有一个简单的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 个答案:

答案 0 :(得分:10)

XStream真的很棒。

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

您可以为您的类甚至自定义数据格式设置别名,以使XML文件更具可读性。

答案 1 :(得分:5)

已经提到的解决方案(XStream和Apache Commons Digester)的替代方案将是Java自己的JAXB,用于类似的通用方法,或者更适合于像Apache Commons {{}的配置的解决方案。 3}}或Java的Configuration

答案 2 :(得分:4)

我实际上会推荐Apache Digester,因为如果你的类是bean,它只会把XML读入它们。

答案 3 :(得分:2)

你也可以使用Spring - 虽然如果一部手机用于手机游戏,它可能有点过分了!

答案 4 :(得分: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>

但是你可以选择在注释中添加(entry =“myName”),XML将像这样保存下来

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

但是一旦加载到数组中,最终结果就是一样。

答案 5 :(得分:1)

使用JAXB。它从Java 1.6开始包含在JDK中。