在此链接: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