[英]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
注釋類, @XmlRootElement
在ObjectFactory
類上生成一個或多個@XmlElementDecl
注釋。 這將導致JAXBElement
被解組。
處理所有結果
如果您不知道是否將返回JAXBElement
您可以利用JAXBIntrospector
進行任何必要的展開。
JAXBIntrospector ji = jaxbContext.createJAXBIntrospector();
Menulist menulist = (Menulist) ji.getValue(unmarshaller.unmarshal(xml));
欲獲得更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.