我正在尝试从xml文件创建java对象。我正在使用jaxb(解组)来创建java对象。我收到错误javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are
我做了一些谷歌并发现,我们需要xsd文件才能这样做...所以我使用apache inst2xsd工具将其转换为xsd。我正在使用以下java代码:
import java.io.FileNotFoundException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="report")
public class Report
{
public static void main(String [] args) throws FileNotFoundException
{
try
{
JAXBContext jc = JAXBContext.newInstance(new Class[] {com.bcbsks.testjb.Report.class});
Unmarshaller um = jc.createUnmarshaller();
Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd"));
}
catch( UnmarshalException ue )
{
ue.printStackTrace();
}
catch( JAXBException je )
{
je.printStackTrace();
}
}
}
但是我得到的是因为错误:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are (none)
你能告诉我我在做什么错吗?
非常感谢任何帮助。
答案 0 :(得分:6)
我认为你错过了几个步骤。你没有发布report.xsd是什么,也没有发布样本xml,所以我将采取一些猜测。
对于初学者,你试图解组xsd而不是xml,这本身就是问题的根源。话虽如此,您的Report.java类看起来看起来不正确,因此即使您尝试使用xml文件,您的解组也不太可能正常工作。
如果您有正确创建的XSD文件,首先应该使用xjc
创建JaxB POJO。 xjc
随java一起安装,您可以使用它从xsd创建带注释的java类。它还将创建另外两个文件--JAXB使用的ObjectFactory.java和package-info.java。 (您可以使用-d参数指定输出路径(请参阅--help以获取完整的开关列表)
xjc -d c:\dev\myproject\src\main\java report.xsd
生成这些文件后,必须根据该包/文件创建JAXBContext。
JAXBContext jc = JAXBContext.newInstance(something.generated.Report.class);
Unmarshaller um = jc.createUnmarshaller();
Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd"), Report.class).getValue();
unmarshaller生成一个JAXBElement,您可以从中提取实际的报告类。
希望这会有所帮助。
答案 1 :(得分:4)
您尝试解组的bean上没有属性。但更重要的是,您正试图从XSD本身反序列化您的对象。错误消息是一个很好的指标:
unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema")
JAXB正在吐出此错误消息,因为它正在尝试将XSD的元数据映射到bean的属性。当然,你的豆子实际上并没有。错误消息的下一部分表示:
Expected elements are (none)
您需要正确定义Java Bean(在其上放置一些属性!),并实际获得一个表示bean序列化版本的XML文件。