JAXB:尝试使用JAXB解组XML时出现类转换异常

时间:2010-05-04 06:22:41

标签: java jaxb

我是JAXB的新手,我正在尝试使用JAXB进行示例。

尝试显示MenuList.xml中的值

---- ----------- MenuList.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<menulist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Category1 name="Development">
        <MenuItem1>Projects</MenuItem1>
        <MenuItem2>Library</MenuItem2>
        <MenuItem3>Library1</MenuItem3>
    </Category1>    
</menulist>

---------------------------- MenuList.xsd ---------------- ---

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio Developer Edition (Trial) 8.0.11.2171 (http://www.liquid-technologies.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="menulist">
        <xs:complexType>
            <xs:sequence>
                <xs:element  name="Category1">
                    <xs:complexType>
                        <xs:attribute name="MenuItem1" type="xs:string" use="required" />
                        <xs:attribute name="MenuItem2" type="xs:string" use="required" />
                        <xs:attribute name="MenuItem3" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

uisng命令我运行xsd文件并生成类。 MenuList和Object Factory。

AppTest.java

package com.xx.menu;

import java.io.File;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;

public class TestNew {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
        JAXBContext jc = JAXBContext.newInstance("com.xx.menu");        //Create unmarshaller
        Unmarshaller um = jc.createUnmarshaller();

        File file = new File ("C:\\sample\\menulist.xml");

        JAXBElement element = (JAXBElement)um.unmarshal(file);

        Menulist menulist= (Menulist) element.getValue ();
        System.out.println("name : "+menulist.getMenu());

        }
     catch( UnmarshalException ue ) {
         ue.printStackTrace();
        System.out.println( "Caught UnmarshalException" );
    } catch( JAXBException je ) { 
        je.printStackTrace();
    } catch( Exception ioe ) {
        ioe.printStackTrace();
    }
    }

}

错误:

java.lang.ClassCastException: com.xx.menu.Menulist
    at com.xx.menu.TestNew.main(TestNew.java:26)

你能帮我解决我错的地方......我将非常感谢你。

由于

2 个答案:

答案 0 :(得分:3)

你的事情太复杂了。如果JAXBElement直接向您提供Unmarshaller对象,则无需使用MenulistClassCastExcepotion几乎告诉你需要做什么:

Menulist menulist= (Menulist) um.unmarshal(file);

JAXBElement仅用于某些特定情况,而这不是其中之一。

答案 1 :(得分:1)

  

请您添加关于JAXBElement的简短说明   用吗?

当类或属性本身不包含足够的信息以指示应该将哪个元素写入XML时,JAXB使用

JAXBElement

<强> @XmlRootElement

在您的示例中,Menulist类对应于menulist元素。由于在模式中元素具有匿名复杂类型,因此一个元素与从相应复杂类型生成的类相关联。

<强> @XmlElementDecl

如果在您的示例中menulist元素对应于命名的复杂类型,则可能多个元素可能对应于从该复杂类型生成的同一个类。不是使用@XmlRootElement注释类,而是在@XmlElementDecl类上生成一个或多个ObjectFactory注释。这将导致JAXBElement被解组。

处理所有结果

如果您不知道是否会返回JAXBElement,您可以利用JAXBIntrospector进行必要的解包。

    JAXBIntrospector ji = jaxbContext.createJAXBIntrospector();
    Menulist menulist = (Menulist) ji.getValue(unmarshaller.unmarshal(xml));

了解更多信息