如何使用jaxb创建java对象

时间:2012-01-26 02:03:35

标签: java jaxb

我正在尝试从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)

你能告诉我我在做什么错吗?

非常感谢任何帮助。

2 个答案:

答案 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文件。