有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JAXB:尝试使用JAXB解组XML时发生类强制转换异常

我是JAXB的新手,我正在尝试使用JAXB进行采样

试图显示菜单列表中的值。xml

----美努利斯特。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>

------------------------------美努利斯特。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>

UI使用命令运行xsd文件并生成类。 菜单列表和对象工厂

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)

你能帮我找出哪里出了问题吗。。。我将非常感谢你

谢谢


共 (1) 个答案

  1. # 1 楼答案

    Could you please add a short description about when JAXBElement is to be used?

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

    @XmlRootElement

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

    @xmlementdecl

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

    处理所有结果

    如果您不知道是否会返回JAXBElement,可以利用JAXBIntrospector进行任何必要的展开

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

    了解更多信息