我是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)
你能帮我解决我错的地方......我将非常感谢你。
由于
答案 0 :(得分:3)
你的事情太复杂了。如果JAXBElement
直接向您提供Unmarshaller
对象,则无需使用Menulist
。 ClassCastExcepotion
几乎告诉你需要做什么:
Menulist menulist= (Menulist) um.unmarshal(file);
JAXBElement
仅用于某些特定情况,而这不是其中之一。
答案 1 :(得分:1)
当类或属性本身不包含足够的信息以指示应该将哪个元素写入XML时,JAXB使用请您添加关于JAXBElement的简短说明 用吗?
JAXBElement
。
<强> @XmlRootElement 强>
在您的示例中,Menulist
类对应于menulist
元素。由于在模式中元素具有匿名复杂类型,因此一个元素与从相应复杂类型生成的类相关联。
<强> @XmlElementDecl 强>
如果在您的示例中menulist
元素对应于命名的复杂类型,则可能多个元素可能对应于从该复杂类型生成的同一个类。不是使用@XmlRootElement
注释类,而是在@XmlElementDecl
类上生成一个或多个ObjectFactory
注释。这将导致JAXBElement
被解组。
处理所有结果
如果您不知道是否会返回JAXBElement
,您可以利用JAXBIntrospector
进行必要的解包。
JAXBIntrospector ji = jaxbContext.createJAXBIntrospector();
Menulist menulist = (Menulist) ji.getValue(unmarshaller.unmarshal(xml));
了解更多信息