簡體   English   中英

JAXB:嘗試使用JAXB解組XML時出現類轉換異常

[英]JAXB :Class cast exception while trying to unmarshall XML using 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)

你能幫助我,在我出錯的地方......我將非常感謝你。

謝謝

你的事情太復雜了。 如果Unmarshaller直接為您提供Menulist對象,則無需使用JAXBElement ClassCastExcepotion幾乎告訴你需要做什么:

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

JAXBElement僅在某些特定情況下使用,而這不是其中之一。

你能否加上關於何時使用JAXBElement的簡短描述?

當類或屬性本身不包含足夠的信息以指示應將哪個元素寫入XML時,JAXB將使用JAXBElement

@XmlRootElement

在你的例子中, Menulist類對應於menulist元素。 由於在模式中元素具有匿名復雜類型,因此一個元素與從相應復雜類型生成的類相關聯。

@XmlElementDecl

如果在您的示例中, menulist元素已對應於命名的復雜類型,則可能多個元素可能對應於從該復雜類型生成的相同類。 不是使用@XmlRootElement注釋類, @XmlRootElementObjectFactory類上生成一個或多個@XmlElementDecl注釋。 這將導致JAXBElement被解組。

處理所有結果

如果您不知道是否將返回JAXBElement您可以利用JAXBIntrospector進行任何必要的展開。

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

欲獲得更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM