如何使用jaxb创建java对象

use*_*591 5 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(); 
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了fol;由于错误:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are  (none)
Run Code Online (Sandbox Code Playgroud)

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

任何帮助是极大的赞赏.

Eri*_* B. 6

我想你错过了几步.你没有发布report.xsd是什么,也没有发布样本xml,所以我将采取一些猜测.

对于初学者,你试图解组xsd而不是xml,这本身就是问题的根源.话虽这么说,你的Report.java类看起来看起来不正确,所以即使你试图攻击你的xml文件,你的解组也不太可能.

如果你有一个正确创建的XSD文件,你应该做的第一件事是使用创建JaxB POJO xjc. xjc与java一起安装,您可以使用它从xsd创建带注释的java类.它还将创建另外两个文件--JAXB使用的ObjectFactory.java和package-info.java.(您可以使用-d参数指定输出路径(有关开关的完整列表,请参阅--help)

xjc -d c:\dev\myproject\src\main\java report.xsd
Run Code Online (Sandbox Code Playgroud)

生成这些文件后,必须根据该包/文件创建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();
Run Code Online (Sandbox Code Playgroud)

unmarshaller生成一个JAXBElement,您可以从中提取实际的报告类.

希望这可以帮助.