2016-09-07 66 views
0

在此鏈接:JAXB Unmarshalling XML string - Looping through all tags 它提出了一個很好的解決方案。 我試圖從中受益,但我無法在我的情況下工作。Unmarshal對象內部的Java循環

考慮一個這樣的XML:

<campaign value="field1"> 
    <name value="firstName"/> 
    <type value="type"/> 
    <record> 
    <firstTime value="13"/> 
    <secondTime value="14"/> 
    </record> 
</campaign> 

,並考慮解組中的所有類,創建和工作。 運動類,包含名稱,價值,記錄[]等

JAXBContext c = JAXBContext.newInstance(Campaign.class); 
Unmarshaller u = c.createUnmarshaller(); 
Campaign campaign = (Campaign) u.unmarshal(file); 

我可以提取「名」和「類型」的值,但是,因爲列表<>的,我不能夠超越這個。

private String Name = null; 
[...] 
Name = campaign.getName().getValue(); 
System.out.println(Name); 

你將如何循環到<record>,並獲得firstTime和secondTime所有的值,知道有可能是在其他的XML文件更<record>

編輯: 運動類

@XmlRootElement(name = "Campaign") 
@XmlType(name = "Campaign", propOrder = { 
    "Name", 
    "Type", 
    "Record" }) 
public class Campaign { 
    @XmlElement(required = true) 
    protected Name Name; 

    @XmlElement(required = true) 
    protected Type Type; 

    @XmlElement(required = true) 
    protected List<Record> Record= new ArrayList<Record>(); 


    public Name getName() {return Name;} 
    public void setName (Name value) {this.Name= value;} 

    public Type getType() {return Type;} 
    public void setType (Type value) {this.Type = value;} 

    public void setRecord(Recordvalue) {this.Record.add(value);} 
} 

記錄類

@XmlRootElement(name = "Record") 
@XmlType(name = "Record", propOrder = { 
    "firstTime", 
    "secondTime" }) 
public class Record{ 
    @XmlElement(required = true) 
    protected firstTime firstTime; 

    @XmlElement(required = true) 
    protected secondTime secondTime; 


    public Name getFirstTime() {return firstTime;} 
    public void setFirstTime (firstTime value) {this.firstTime= value;} 

    public Name getSecondTime() {return secondTime;} 
    public void setSecondTime (secondTime value) {this.secondTime= value;} 
} 

程序得多大,但它只是不斷重複。我需要提取的一切以便稍後上傳到數據庫。 但現在,我只需要在屏幕上打印它們,並知道我擁有所有我需要的值。

是的,我也看過那個鏈接,我不知道爲什麼我不能專注於如何繼續,似乎最糟糕的部分對我來說更容易!

感謝

編輯3我忘了粘貼設置的方法和得到的。

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Type") 
public class Type { 

    @XmlAttribute 
    protected String value; 

    public String getValue() {return value;} 
    public void setValue(String value) {this.value = value;} 
} 

這對所有人來說都是一樣的,我只是在這裏粘貼了Type。

編輯4:分辨率 我終於找到了解決方案,這是不是提議和標記爲正確的解決方案。雖然它幫助我創造了getRecord()獲得者。

不改變我的代碼,但添加到記錄。類:

public List<Record> getRecord() { return this.Record; } 

和主類:

for (int i=1; i<=campaign.getRecord().size(); i++) {    System.out.println(campaign.getRecord().get(i-1).getFirstTime().getValue()); 
System.out.println(campaign.getRecord().get(i-1).getSecondTime().getValue()); 
} 

我能夠打印出「13」和「14」,更在一般情況下,我能夠打印內部record如果record什麼會有另一個列表裏面,一個:

for (int j=1; j<= campaign.getRecord().get(i-1).getANewListInsideRecord().size(); j++) { 
System.out.println(campaign.getRecord().get(i-1).getANewListInsideRecord().get(j-1).getAObject().getValue()); 
} 

將完成這項工作。

-1因爲它從0開始。

+0

嘗試解組元素; 請參閱:http://stackoverflow.com/questions/11152917/iterate-through-the-elements-in-jaxb –

+0

您可以添加您的Campaign和Record代碼,以便我們檢查您使用的映射嗎? –

+0

問題已更新!謝謝 – Nihvel

回答

1

我還不確定你的問題是什麼。告訴我,如果我的答案不是你要找的。

你有幾個變化,使:

@XmlRootElement(name = "campaign") 
@XmlType(name = "campaign", propOrder = { 
    "name", 
    "type", 
    "record" }) 
public class Campaign { 
    @XmlElement(required = true) 
    protected Name name; 

    @XmlElement(required = true) 
    protected Type type; 

    @XmlElement(required = true) 
    protected List<Record> record; 


    public Name getName() {return name;} 
    public void setName (Name value) {this.name= value;} 

    public Type getType() {return type;} 
    public void setType (Type value) {this.type = value;} 

    //Initialise your record list inside the getter instead of in member declaration 
    public List<Record> getRecord() { 
     if(this.record == null) record = new ArrayList<>(); 
     return this.record; 
    } 

    //Do not use a setter as an add method for the list 
    public void setRecord(List<Record> value) {this.record = value;} 

    //If you need to add record inside your list, do not use a setter, define an add method or access the list with the getter. 
    public void addRecord(Record value) {this.record.add(value);} 
} 

我您已經定義了適當的toString()方法對所有在競選中使用的類的假設下去。

對於爲例,記錄類字符串可能會喜歡:

@Override 
public String toString(){ 
    return " First value : + "this.firstTime.getValue() + " Second value : " +this.secondTime.getValue(); 
} 

我們展示的一切:

List<File> files = new ArrayList<>(); 

//Add all XML Files containing a campaign root element into the files list 
JAXBContext c = JAXBContext.newInstance(Campaign.class); 
Unmarshaller u = c.createUnmarshaller(); 

//Declare list to store all of your camapaign object 
List<Campaign> campaigns = new ArrayList<>(); 

for(File f : files) 
{ 
    campaigns.add(u.unmarshall(f)); 
} 

//display all campaigns 
for(Campaign camp : campaigns){ 
    System.out.println(camp.getName()); 
    System.out.println(camp.getType()); 

    //Display all records 
    for(Record rec : camp.getRecord()){ 
     System.out.println(rec); 
    } 
} 

當然你可以改變的System.out.println()線到任何你想要的代碼。

+0

好!這令人印象深刻。沒想到你身邊有這麼多的工作!我今天的轉變剛剛結束,我將盡快完成。我會說我會接受這個最好的答案,當之無愧!我會看看我是否能夠正常工作(:謝謝你! – Nihvel

+0

我更新了我的問題,我仍然將你的答案標記爲最佳答案,但是我解決了使用我的代碼的問題,謝謝你的幫助!getRecord()我錯過了什麼。 – Nihvel