2014-11-08 14 views
0

我有這樣一個一個xml的列表:爲了像XML架構的Java

<?xml version="1.0" encoding="UTF-8"?> 
<plane> 
<part> 
    <desc>qwe</desc> 
    <qty>1</qty> 
</part> 
<part> 
    <desc>asd</desc> 
    <qty>1</qty> 
     <part> 
      <desc>asdfg</desc> 
      <qty>1</qty> 
     </part> 
     <part> 
      <desc>asdfg</desc> 
      <qty>4</qty> 
     </part> 
    </part> 
<part> 
    <desc>zxc</desc> 
    <qty>2</qty> 
</part> 
<part> 
    <desc>AAAA</desc> 
    <qty>1</qty> 
     <part> 
      <desc>BBBB</desc> 
      <qty>1</qty> 
       <part> 
        <desc>CCCC</desc> 
        <qty>13</qty> 
         <part> 
          <desc>DDDD</desc> 
          <qty>12</qty> 
           <part> 
            <desc>EEEE</desc> 
            <qty>21</qty> 
           </part> 
         </part> 
       </part> 
       <part> 
        <desc>CCCC1111</desc> 
        <qty>13</qty> 
         <part> 
          <desc>DDDD1111</desc> 
          <qty>12</qty> 
           <part> 
            <desc>EEEE1111</desc> 
            <qty>21</qty> 
           </part> 
         </part> 
       </part> 
     </part> 
     <part> 
      <desc>G</desc> 
      <qty>1</qty> 
       <part> 
        <desc>H</desc> 
        <qty>13</qty> 
         <part> 
          <desc>I</desc> 
          <qty>12</qty> 
         </part> 
       </part> 
     </part> 
</part> 
</plane> 

現在我想將其打印出來的「相同」的結構。我創建了一個方法,但輸出不同於expectes: Run。類

public class Run { 

public static void itarate(List<Part> list){ 
    for (int i = 0; i<list.size(); i++){ 
     System.out.println(list.get(i).getDesc() + " x " + list.get(i).getQty()); 
     if (list.get(i).getListParts() != null){ 
      System.out.print(" -- "); 
      itarate(list.get(i).getListParts()); 

     } 
    } 
} 


    public static void main(String[] args) { 



    Converter converter = new XML_Converter(); 
    Plane plane = converter.readFile(); 
    //System.out.println(plane); 
    List<Part> parts = plane.getPlaneParts(); 


    itarate(parts); 

} 

} 

輸出:

qwe x 2 
AAAA x 1 
    BBBB x 1 
    CCCC x 13 
    DDDD x 12 
    EEEE x 21 
CCCC1111 x 13 
    DDDD1111 x 12 
    EEEE1111 x 21 
G x 1 
    H x 13 
    I x 12 

,但其實我是想是這樣的:

qwe x 2 
AAAA x 1 
    BBBB x 1 
    CCCC x 13 
     DDDD x 12 
     EEEE x 21 
    CCCC1111 x 13 
    DDDD1111 x 12 
     EEEE1111 x 21 
G x 1 
    H x 13 
    I x 12 

XML對象類:

public class XML_Converter{ 

private String filePath = "D:\\file.xml"; 
private File file = new File(filePath); 

@Override 
public Plane readFile() { 
    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Plane.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     Plane plane = (Plane) jaxbUnmarshaller.unmarshal(file); 
     return plane; 
    } catch (JAXBException e) { 
     System.out.println("Unable to load file. Try again."); 
    } 
    return new Plane(); 

} 

平面類

@XmlRootElement 
public class Plane { 

private List<Part> planeParts = null; 


@XmlElement(name="part") 
public List<Part> getPlaneParts() { 
    return planeParts; 
} 

public void setPlaneParts(List<Part> planeParts) { 
    this.planeParts = planeParts; 
} 

@Override 
public String toString() { 
    return "Plane [planeParts=" + planeParts + "]"; 
} 


} 

Parts.class

public class Part { 

private String desc; 
private int qty; 

private List<Part> listParts = null; 


@XmlElement(name="desc") 
public String getDesc() { 
    return desc; 
} 

@XmlElement(name="part") 
public List<Part> getListParts() { 
    return listParts; 
} 

@XmlElement(name="qty") 
public int getQty() { 
    return qty; 
} 

public void setDesc(String desc) { 
    this.desc = desc; 
} 

public void setListParts(List<Part> listParts) { 
    this.listParts = listParts; 
} 

public void setQty(int qty) { 
    this.qty = qty; 
} 

@Override 
public String toString() { 
    return "Part [desc=" + desc + ", qty=" + qty + ", listParts=" 
      + listParts + "]"; 
} 


} 

我怎樣才能做到這一點(所以XML結構是相似的代碼輸出)? 在此先感謝。

+0

包括完整代碼。包括 – hfontanez 2014-11-08 10:06:18

+0

,如你所願 – kamirru 2014-11-08 10:20:01

+0

我認爲有一種方法可以不用遞歸來做到這一點,但它需要改變你的XML結構。另外,我認爲我從最近一直工作的某個地方認識到這個「Plane」XML結構。如果你正在做我認爲你在做的事,恭喜你! – hfontanez 2014-11-08 10:46:15

回答

2

周圍通過當前遞歸層次的變量(例如R)和相應的打印的空格數

public static void itarate(List<Part> list,int r){ 
    for (int i = 0; i<list.size(); i++){ 
     for(int j=0;j<r;j++) 
      System.out.print(" "); 
     System.out.println(list.get(i).getDesc() + " x " + list.get(i).getQty()); 
     if (list.get(i).getListParts() != null){ 
      itarate(list.get(i).getListParts(),r+1); 

     } 
    } 

EDIT:移到縮進東西從內循環的

+0

嗯,設置爲0使循環只去一次。設置爲1會使很多重複的東西... – kamirru 2014-11-08 10:27:02

+0

目前沒有掌握javac。將縮進內容移出循環。基本思想是你必須根據遞歸深度修改縮進。你沒有這樣做。順便說一句。我會假設設置r = 0會使循環從不重複。 – Oncaphillis 2014-11-08 10:34:44