Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use jaxb to create java objects

Tags:

java

jaxb

I am trying to create java objects from xml file. I am using jaxb(unmarshalling) to create java objects.I am getting errors javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are

I did some google and found out that, we need xsd file to do that... so I converted it to xsd using apache inst2xsd tool. I am using following java code:

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(); 
        } 
    }
}

But I am getting fol;owing error:

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

Can you please tell me whats wrong I am doing?

Any help is greatly appreciated.

like image 596
user122591 Avatar asked Jan 26 '12 02:01

user122591


2 Answers

I think you are missing a few steps. You didn't post what report.xsd is, nor a sample xml, so I'm going to take a few guesses.

For starters, you are trying to unmarshal the xsd and not xml, which is itself the root of the problem. That being said, your Report.java class does not look properly generated so it is unlikely that your unmarshalling would work even if you tried against your xml file.

If you have a properly created XSD file, the first thing you should do is create the JaxB POJOs using xjc. xjc comes installed with java, and you use it to create annotated java classes from the xsd. It will also create 2 additional files - ObjectFactory.java and package-info.java which are used by JAXB. (You can specify the output path using the -d param (see --help for the full list of switches)

xjc -d c:\dev\myproject\src\main\java report.xsd

Once you have those files generated, you have to create your JAXBContext based on that package/file.

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();

The unmarshaller generates a JAXBElement, from which you can extract the actual report class.

Hope this helps.

like image 64
Eric B. Avatar answered Oct 19 '22 17:10

Eric B.


There are no properties on the bean you are trying to unmarshal. But more importantly, you are trying to deserialize your object from the XSD itself. The error message is a good indicator here:

unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema")

JAXB is spitting out this error message because it is attempting to map the XSD's metadata to properties of your bean. Which of course, your bean doesn't actually have any. The next part of the error message indicates as much:

Expected elements are (none)

You need to define your Java Bean properly (put some properties on it!), and actually get an XML file that represents the serialized version of your bean.

like image 33
Perception Avatar answered Oct 19 '22 17:10

Perception