2015-09-12 64 views
0

我正在使用JAXB將xml轉換爲對象。在做了一些教程之後,我可以成功將簡單的xml(具有單個對象和唯一元素標記)轉換爲對象。然後我需要處理更復雜的xml,它有多個實例和一個父標籤。我仍然使用類似的結構。但我無法得到三個國家對象的預期產出。我的代碼有什麼問題?請幫忙。 的IntelliJ IDE控制檯輸出是:多實例xml文件ummarshalling到對象

[email protected] 

Process finished with exit code 0 

xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Countries> 
<Country> 
    <Country_Name>Spain</Country_Name> 
    <Country_Capital>Madrid</Country_Capital> 
    <Country_Continent>Europe</Country_Continent> 
</Country> 
<Country> 
    <Country_Name>USA</Country_Name> 
    <Country_Capital>Washington</Country_Capital> 
    <Country_Continent>America</Country_Continent> 
</Country> 
<Country> 
    <Country_Name>Japan</Country_Name> 
    <Country_Capital>Tokyo</Country_Capital> 
    <Country_Continent>Asia</Country_Continent> 
</Country> 
</Countries> 

Countries.java

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(propOrder = { "name", "capital", "foundation", "continent" , "population"}) 
@XmlRootElement(name = "Countries") 
public class Countries { 


private int population; 
private String name; 
private String capital; 
private int importance; 
private String foundation; 
private String continent; 

@XmlElement(name = "Country_Population") 
public void setPopulation(int population) { 
    this.population = population; 
} 

@XmlElement(name = "Country_Name") 
public void setName(String name) { 
    this.name = name; 
} 

@XmlElement(name = "Country_Capital") 
public void setCapital(String capital) { 
    this.capital = capital; 
} 

@XmlAttribute(name = "importance", required = true) 
public void setImportance(int importance) { 
    this.importance = importance; 
} 

@XmlElement(name = "Country_foundation") 
public void setFoundation(String foundation) { 
    this.foundation = foundation; 
} 

@XmlElement(name = "Country_Continent") 
public void setContinent(String continent) { 
    this.continent = continent; 
} 

}

CountryReader.java

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import java.io.File; 

public class CountryReader { 
public static void main(String[] args) throws JAXBException { 
    File file = new File("country.xml"); 
    JAXBContext jaxbContext = JAXBContext.newInstance(Countries.class); 
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
    Countries countres = (Countries)jaxbUnmarshaller.unmarshal(file); 
    System.out.println(countres); 
    } 
} 

回答

0

您應該分開根元素和嵌套集合元素的映射。

所以你有這樣的事情:

@XmlRootElement(name = "Countries") 
public class Countries { 
    private List<Country> countries; 

    @XmlElement(name = "Country") 
    public void setCountries(List<Country> countries) { 
     this.countries = countries; 
    } 
} 

@XmlType(propOrder = { "name", "capital", "foundation", "continent" , "population"}) 
@XmlRootElement(name = "Country") 
public class Country { 
    private int population; 
    private String name; 
    private String capital; 
    private int importance; 
    private String foundation; 
    private String continent; 

    @XmlElement(name = "Country_Population") 
    public void setPopulation(int population) { 
     this.population = population; 
    } 

    @XmlElement(name = "Country_Name") 
    public void setName(String name) { 
     this.name = name; 
    } 

    @XmlElement(name = "Country_Capital") 
    public void setCapital(String capital) { 
     this.capital = capital; 
    } 

    @XmlAttribute(name = "importance", required = true) 
    public void setImportance(int importance) { 
     this.importance = importance; 
    } 

    @XmlElement(name = "Country_foundation") 
    public void setFoundation(String foundation) { 
     this.foundation = foundation; 
    } 

    @XmlElement(name = "Country_Continent") 
    public void setContinent(String continent) { 
     this.continent = continent; 
    } 
} 

有關與集合在JAXB處理的更多信息,請參閱this博客文章。 @XmlElementWrapper似乎適合您的任務,但我不認爲它可以直接與根元素一起使用。