2016-09-07 94 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