这是我第一次尝试制作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读取创建对象?设置对象的所有变量然后将其传递给构造函数似乎很麻烦。
答案 0 :(得分:2)
您希望使用Java Architecture for XML Binding (JAXB),它允许从xml文本到Java对象的反序列化。基本上,您使用默认构造函数的常规Java bean,添加注释以将属性绑定到XM元素,并让解析器执行...好吧,解析。
一种流行的替代方案是Jackson XML extension,它提供了类似的功能,更易于使用