2016-07-03 45 views
0

這是我在做一個Java應用程序第一次嘗試。最終我將使用JavaFX來合併圖形。有沒有更好的方法?讀取XML構建對象

我的第一步是要導入配置像XML文件中的數據,以構建瓷磚對象的集合。

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

我應該返回tileGallery的ArrayList到將要調用ReadTileXML方法,該方法的類似的功能? – JamesA

回答

2

你想用Java Architecture for XML Binding (JAXB)允許從XML文本到Java對象序列化。基本上你使用默認的構造函數來定義Java bean,添加註釋來將屬性綁定到XM元素,並讓解析器執行......解析。

一個流行的選擇是Jackson XML extension賦予更多的易用性

+0

對於很好的衡量標準:JAXB(帶註釋)非常簡單。 –

相關問題