有没有更好的办法?读取XML以构造对象

时间:2016-07-03 18:56:08

标签: java xml constructor

这是我第一次尝试制作Java应用程序。最终,我将使用JavaFX来合并图形。

我的第一步是从XML文件导入类似数据的配置,以构建Tile对象的集合。

public Tile (String name, String imageName, int type, int up, int right,
        int down, int left,int feature){

    this.Name = name;
    this.imageName = imageName;
    this.type = type;
    this.sides.add(up);
    this.sides.add(right);
    this.sides.add(down);
    this.sides.add(left);
    this.feature = feature;
}

public static void ReadTileXML(){
    try {
        Element tileElement;
        String tileName = null;
        String tileImageName = null;
        int tileCount = 0;
        int tileType = 0;
        int up = 0;
        int right = 0;
        int down = 0;
        int left = 0;
        int tileFeature = 0;
        ArrayList<Integer> sidesImport = new ArrayList<>();
        ArrayList<Tile> tileGallery = new ArrayList<>(); 

        Element channelElement = ((Document) (new SAXBuilder()).build(new File("src/Resources/Tiles.xml"))).getRootElement();
        List<Element> tileImport = channelElement.getChildren(channelElement.getName());

        for (int i=0; i < tileImport.size(); i++) {
            tileElement = (Element) tileImport.get(i);
            List<Element> tileAttribs = tileElement.getChildren();

            for (Element tileAttrib : tileAttribs) {
                switch(tileElement.getName()) {
                    case "Name":
                        tileName = tileAttrib.getText();
                        break;
                    case "imageName":
                        tileImageName = tileAttrib.getText();
                        break;
                    case "type":
                        tileType = Integer.parseInt(tileAttrib.getText());
                        break;
                    case "Count":
                        tileCount = Integer.parseInt(tileAttrib.getText());
                        break;
                    case "Sides":
                        sidesImport.clear();
                        List<Element> tileSides = tileElement.getChildren(tileElement.getName());
                        for (Element tileSide : tileSides){
                            sidesImport.add(Integer.parseInt(tileSide.getText()));
                        }
                        break;
                    case "Feature":
                        tileFeature = Integer.parseInt(tileAttrib.getText());
                        break;
                    default:
                        System.out.println("Malformed TileXML, unknown Element.");

                }
                Tile tile = new Tile(tileName,tileImageName,tileType,sidesImport.get(0)
                    ,sidesImport.get(1),sidesImport.get(2),sidesImport.get(3)
                    ,tileFeature);
                tileGallery.add(tile);
            }
        }
    } catch (JDOMException ex) {
        System.out.println(ex);
    } catch (IOException ex) {
        System.out.println(ex);
    }
}

我觉得我使用的过程有点沉重。有没有更好的方法从XML读取创建对象?设置对象的所有变量然后将其传递给构造函数似乎很麻烦。

1 个答案:

答案 0 :(得分:2)

您希望使用Java Architecture for XML Binding (JAXB),它允许从xml文本到Java对象的反序列化。基本上,您使用默认构造函数的常规Java bean,添加注释以将属性绑定到XM元素,并让解析器执行...好吧,解析。

一种流行的替代方案是Jackson XML extension,它提供了类似的功能,更易于使用