2

我的主要课程是

    public static void main(String[] args) throws JAXBException,
        FileNotFoundException {

    Class[] classes = new Class[5];
    classes[0] = com.kk.AddressDetails.class;
    classes[1] = com.kk.COUNTRY.class;
    classes[2] = com.kk.ObjectFactory.class;
    classes[3] = com.kk.Details.class;
    classes[4] = com.kk.Districts.class;

    JAXBContext context = JAXBContext.newInstance(classes);

    Unmarshaller unmarshaller = context.createUnmarshaller();

    JAXBElement<COUNTRY> unmarshal = (JAXBElement<COUNTRY>) unmarshaller
            .unmarshal(new File("src\\countrydetails.xml"));
    COUNTRY value = unmarshal.getValue();
            System.out.println(value);

因此,在编译这个时,我在线程“main”java.lang.ClassCastException 中得到了这个异常:com.kk.COUNTRY cannot be cast to javax.xml.bind.JAXBElement at main.kk.ClientApp.main(ClientApp.java:31)

4

3 回答 3

3

由于您的COUNTRY类带有注释,@XmlRootElement这意味着它与根元素唯一关联,并且解组操作的结果将是COUNTRY

COUNTRY c = (COUNTRY) unmarshaller.unmarshal(xml);

相反,如果COUNTRY有一个或多个相应@XmlElementDecl的注释,或者您使用了unmarshal一个带有参数的方法,Class您将获得一个实例JAXBElement

JAXBElement<COUNTRY> c = unmarshaller.unmarshal(xml, COUNTRY.class);

了解更多信息

于 2013-06-27T09:19:05.013 回答
2

那是因为Unmarshaller.unmarshal(File f)返回 anObject而不是JAXBElement

这是签名:

public Object unmarshal( java.io.File f ) throws JAXBException;

您的解决方案应该是:

COUNTRY value = unmarshaller.unmarshal(new StreamSource(new File("src\\countrydetails.xml")), COUNTRY.class);
于 2013-06-27T07:05:42.157 回答
0

您无需将解组结果强制转换为 JAXBElement,它应该只是您尝试解组的 COUNTRY 类。假设您已经正确注释了 COUTNRY 类,那么您可以简单地执行以下操作:

COUNTRY unmarshal = (COUNTRY) unmarshaller
            .unmarshal(new File("src\\countrydetails.xml"));

按照本教程通过简单示例了解 JAXB 编组和解组:

http://www.mkyong.com/java/jaxb-hello-world-example/

于 2013-06-27T07:06:26.623 回答