Code I/O

A topnotch WordPress.com site

5 Minutes on Java – A quick tutorial on JAXB

12 Comments

New: You can get entire source code for this post from git-hub: http://github.com/udy/lifencode-samples/tree/master/java/jaxb-in-5-minutes/

This is my first post on 5 minutes series of articles on technology and it’s on JAXB.

Read about JAXB at:

http://java.sun.com/developer/technicalArticles/WebServices/jaxb

http://en.wikipedia.org/wiki/JAXB

My simple approach: Create the XML using bottom up approach, once you know how the XML representation is, things can be easy. Let’s say we want to process a email list and take some actions.

<items>
	<item>
		<firstname>George</firstname>
		<lastname>Cross</lastname>
		<email>George.Cross@somedomain.com</email>
	</item>
	<item>
		<firstname>Lisa</firstname>
		<lastname>Monroe</lastname>
		<email>Lisa.Monroe@somedomain.com</email>
	</item>
	<item>
		<firstname>Udy</firstname>
		<lastname>Udy</lastname>
		<email>Udy@somedomain.com</email>
	</item>
	<item>
		<firstname>Nitha</firstname>
		<lastname>Udy</lastname>
		<email>Nitha.Udy@somedomain.com</email>
	</item>
	<item>
		<firstname>Balaji</firstname>
		<lastname>Krishna</lastname>
		<email>Balaji.Krishna@somedomain.com</email>
	</item>
</items>

Once you know the data, you can submit it to some online tools to generate XML schema.  The one that’s cool and fast is

http://www.xmlforasp.net/CodeBank/System_Xml_Schema/BuildSchema/BuildXMLSchema.aspx

For the above above XML the following XSD schema is generated

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified"
	elementFormDefault="qualified" version="1.0"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema">

	<xsd:element name="items" type="itemsType" />
	<xsd:complexType name="itemsType">
		<xsd:sequence>
			<xsd:element maxOccurs="unbounded" name="item" type="itemType" />
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="itemType">
		<xsd:sequence>
			<xsd:element name="firstname" type="xsd:string" />
			<xsd:element name="lastname" type="xsd:string" />
			<xsd:element name="email" type="xsd:string" />
		</xsd:sequence>
	</xsd:complexType>

</xsd:schema>

AFter the schema definition is generated, JAXB plugin can be bought into action to generate code.

Install the JAXB plugin for eclipse from https://jaxb-workshop.dev.java.net/plugins/eclipse/xjc-plugin.html (looks like this plug-in is no longer supported).  I recommend you try it from http://sourceforge.net/projects/jaxb-builder/

Ccreate a XSD file under a eclipse project, and generate code using JAXB (the above URL should show you how to do so).  Make sure you choose the right package names and folder to put the code in.  The package name given here will be used later, I chose “org.onesun.blog.jaxb” as the package name, and chose “src” folder as the destination to generate JAXB classes.  The following source files should now be generated:

ItemsType.java, ItemType.java and ObjectFactory.java

I personally prefer writing an accessor to work the elements generated.  This way working with your email list becomes easy.   Lets examine the EmailListManager.java

While creating JAXB context, just make sure that the package name generated above is the one used, failing which, the application will fail during runtime.  The purpose of this class is just to load the file and unmarshall it, after which you can process the list and take some concrete actions.  Lets discuss about that in another post (say for instance using JavaMail to send HTML email to this users).

EmailListManager.java

package org.onesun.blog;

import java.io.InputStream;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.onesun.blog.jaxb.*;

public class EmailListManager {
	private ItemsType items = null;
	private JAXBContext jaxbContext = null;
	private Unmarshaller unmarshaller = null;

	public EmailListManager(String packageName) {
		try {
			jaxbContext = JAXBContext.newInstance(packageName);
			unmarshaller = jaxbContext.createUnmarshaller();
		} catch (JAXBException e) {
		}
	}

	@SuppressWarnings("unchecked")
	public List loadXML(InputStream istrm) {
		try {
			Object o = unmarshaller.unmarshal(istrm);
			if (items == null) {
				items = (ItemsType) (((JAXBElement) o).getValue());
				return (items.getItem());
			}
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return null;
	}
}

Finally the application can be validated with the xml document used for generating XSD, which will parse through the list of items and print them to stdout.
Main.java

package org.onesun.blog;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.onesun.blog.jaxb.*;

public class Main {
	public static void main(String[] args) {
		EmailListManager xmgr = new EmailListManager("org.onesun.blog.jaxb");
		File file = new File("etc/data.xml");
		List rtList = new ArrayList();
		try {
			FileInputStream fis = new FileInputStream(file);

			if(fis == null) {
				return;
			}
			rtList = xmgr.loadXML(fis);
			Iterator rtItr = rtList.iterator();
			while (rtItr.hasNext()) {
				ItemType item = (ItemType) rtItr.next();
				System.out.println("First Name = " + item.getFirstname().trim()
						+ "ttLast Name = " + item.getLastname().trim()
						+ "ttEmail = " + item.getEmail().trim());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

With this you’re set to use XML you generated for anything you like to do.  Hope this was helpful to you in some way, and believe that you enjoyed the simplicity of it

Advertisements

12 thoughts on “5 Minutes on Java – A quick tutorial on JAXB

  1. Verty good tutorial!
    It’s very easy to work with XML on this way!

  2. Hey,
    I test you sample and run all rigth…
    it´s a good start…
    Thanks…

  3. Pingback: XML to Flat File or DAtabase « Peace be with you

  4. Very very nice fast focused tutorial
    and the eclipse plugin is great
    Thank you

  5. It awesome man!! Thanks allot.

  6. Awesome tutorial! Mucho thanks!

  7. You made it really simple, thanks alot

  8. Thanks Man!!!

  9. You have done a great job!

  10. Thanks Dude.

    Nice one

  11. Thanks! Even after more than 2 years your post helped me a lot!

  12. Hi,
    New to JAXB implementation, as earlier I have used SAX for various implementaions, but this time, I have tried this tutorial for jaxb and I’m getting the following error:
    “Exception in thread “main” java.lang.NullPointerException
    at org.onesun.blog.EmailListManager.loadXML(EmailListManager.java:27)
    at org.onesun.blog.Main.main(Main.java:21)”

    Pls let me know

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s