代码之家  ›  专栏  ›  技术社区  ›  Grumblesaurus

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

  •  6
  • Grumblesaurus  · 技术社区  · 16 年前


    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 回复  |  直到 16 年前
        1
  •  10
  •   facundofarias Ashay Batwal    8 年前

    XStream是一个非常好的库。

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

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

        2
  •  5
  •   Fabian Steeg    16 年前

    上述解决方案的替代方案( XStream Digester )将是Java自己的 JAXB Configuration 还是Java的 Preferences API .

        3
  •  4
  •   Uri    16 年前

        4
  •  2
  •   Fortyrunner    16 年前

    你也可以使用Spring——虽然如果它是用于手机游戏,那么对于一个类来说可能有点过分了!

        5
  •  2
  •   Paul P M    11 年前

    我最近开始使用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>
    

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

    但一旦加载到数组中,最终结果是相同的。

        6
  •  1
  •   user3130667    11 年前