2016-11-13 3 views
0

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; 
    }  
} 

Répondre

0

Il suffit de retirer la @XmlRootElement(name = "data") de la classe CountryPop comme ce qui suit:

@XmlAccessorType(XmlAccessType.FIELD) 
public class CountryPop { 
    @XmlElement(name="date") 
    private int date; 

    public int getDate() { 
     return date; 
    }  
} 

Et si vous gérez l'espace de noms wb devrait fonctionner correctement.

+0

Merci, ça marche! – daintym0sh