Je suis unmarshalling un fichier XML extrait du service Web de la Banque mondiale. L'élément racine et les éléments enfants ont la même étiquette, comme indiqué ci-dessous. J'obtiens une exception ClassCastException lors de la suppression d'unmarshalling. Cette erreur disparaît lorsque je modifie la balise de l'élément racine afin qu'elle ne soit pas la même que ses enfants.JAXB ClassCastException due à l'élément racine ayant la même balise que son élément enfant
JAXB est-il incapable de gérer ce scénario ou n'utilise-t-il pas correctement JAXB?
<data>
<data>
</data>
......
<data>
</data>
</data>
Voici mon code Java pour référence:
XML avec le numéro de tag: http://api.worldbank.org/countries/all/indicators/SP.POP.TOTL?format=xml
classe principale
public class CountryPopParse {
public List<CountryPop> parse() throws JAXBException, MalformedURLException, IOException{
JAXBContext jc = JAXBContext.newInstance(CountryPops.class);
Unmarshaller u = jc.createUnmarshaller();
URL url = new URL("http://api.worldbank.org/countries/all/indicators/SP.POP.TOTL?format=xml");
CountryPops countryPops = (CountryPops) u.unmarshal(url);
return countryPops.getCountryPop();
}
public static void main(String[] args) throws JAXBException, IOException, SQLException{
CountryPopParse p = new CountryPopParse();
List<CountryPop> popList= p.parse();
System.out.println(popList.get(0).getDate());
}
}
classe élément racine
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "data")
public class CountryPops {
@XmlElement(name = "data", type = CountryPop.class)
private List<CountryPop> countryPops = new ArrayList<>();
public CountryPops(){
}
public CountryPops(List<CountryPop> countryPops) {
this.countryPops = countryPops;
}
public List<CountryPop> getCountryPop() {
return countryPops;
}
}
enfant classe élément
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "data")
public class CountryPop {
@XmlElement(name="date")
private int date;
public int getDate() {
return date;
}
}
Merci, ça marche! – daintym0sh