JAXB ClassCastException,因为根元素与其子元素具有相同的标记

时间:2016-11-13 00:51:49

标签: java xml jaxb classcastexception

我正在解密从世界银行网络服务中获取的XML文件。根元素和子元素具有相同的标记,如下所示。解组时我得到一个ClassCastException。当我更改根元素标记以使其与其子元素不同时,此错误消失。

JAXB无法处理这种情况还是我没有正确使用JAXB?

<data>
    <data>
    </data>
    ......
    <data>
    </data>
</data>

这是我的Java代码供参考:

带有代码问题的XML:http://api.worldbank.org/countries/all/indicators/SP.POP.TOTL?format=xml

主要班级

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

根元素类

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

子元素类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "data")
public class CountryPop {

    @XmlElement(name="date")
    private int date;

    public int getDate() {
        return date;
    }    
}

1 个答案:

答案 0 :(得分:0)

只需从@XmlRootElement(name = "data")类中移除CountryPop,如下所示:

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

    public int getDate() {
        return date;
    }    
}

如果您正在处理命名空间 wb 应该可以正常工作。