在此鏈接: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開始。
嘗試解組元素; 請參閱:http://stackoverflow.com/questions/11152917/iterate-through-the-elements-in-jaxb –
您可以添加您的Campaign和Record代碼,以便我們檢查您使用的映射嗎? –
問題已更新!謝謝 – Nihvel