What is XML Pull Parsing?

I came across this clean concept of XML pull parsing in Wikipedia. These paragraphs are easy to understand. Thought of sharing them with you.

Pull parsing treats the document as a series of items which are read in sequence using the Iterator design pattern. This allows for writing of recursive-descent parsers in which the structure of the code performing the parsing mirrors the structure of the XML being parsed, and intermediate parsed results can be used and accessed as local variables within the methods performing the parsing, or passed down (as method parameters) into lower-level methods, or returned (as method return values) to higher-level methods. Examples of pull parsers include StAX in the Java programming language, SimpleXML in PHP and System.Xml.XmlReader in the .NET Framework.

A pull parser creates an iterator that sequentially visits the various elements, attributes, and data in an XML document. Code which uses this iterator can test the current item (to tell, for example, whether it is a start or end element, or text), and inspect its attributes (local name, namespace, values of XML attributes, value of text, etc.), and can also move the iterator to the next item. The code can thus extract information from the document as it traverses it. The recursive-descent approach tends to lend itself to keeping data as typed local variables in the code doing the parsing, while SAX, for instance, typically requires a parser to manually maintain intermediate data within a stack of elements which are parent elements of the element being parsed. Pull-parsing code can be more straightforward to understand and maintain than SAX parsing code. [Source: Wikipedia]

Serialzing A Java Object Into XML and De-Serialzing using XMLEncoder And XMLDecoder

This is my third post related to Java Object Serialization.

In the first post, I talked about serializing a Java Object to a binary file system.

I dealt with serializing the object to MySQL database in my second post.

In this post, I am providing you a working code on how to write (serialize) a java object into XML file using java.beans.XMLEncoder and reading the XML File into Java Object using java.beans.XMLDecoder

The XMLDecoder class is used to read XML documents created using the XMLEncoder and is used just like the ObjectInputStream. For example, one can use the following fragment to read the first object defined in an XML document written by the XMLEncoder class.

The XMLEncoder class is a complementary alternative to the ObjectOutputStream and can used to generate a textual representation of a JavaBean in the same way that the ObjectOutputStream can be used to create binary representation of Serializable objects. Despite the similarity of their APIs, the XMLEncoder class is exclusively designed for the purpose of archiving graphs of JavaBeans as textual representations of their public properties. Like Java source files, documents written this way have a natural immunity to changes in the implementations of the classes involved. The ObjectOutputStream continues to be recommended for interprocess communication and general purpose serialization.

package com.kushal.serialization;

/**
 * @author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modified On: 10th September 2009
 *
 * Serializing Object To XML
 * Deserializing Object From XML
 */

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class ObjectSerializationToXML {

	/**
	 * This method saves (serializes) any java bean object into xml file
	 */
	public void serializeObjectToXML(String xmlFileLocation,
			Object objectToSerialize) throws Exception {
		FileOutputStream os = new FileOutputStream(xmlFileLocation);
		XMLEncoder encoder = new XMLEncoder(os);
		encoder.writeObject(objectToSerialize);
		encoder.close();
	}

	/**
	 * Reads Java Bean Object From XML File
	 */
	public Object deserializeXMLToObject(String xmlFileLocation)
			throws Exception {
		FileInputStream os = new FileInputStream(xmlFileLocation);
		XMLDecoder decoder = new XMLDecoder(os);
		Object deSerializedObject = decoder.readObject();
		decoder.close();

		return deSerializedObject;
	}

	/**
	 * Testing.
	 * 1. Creates and Object.
	 * 2. Serializes Object To XML
	 * 3. Deserializes Object From XML
	 * 4. Prints The values hold in Object
	 */
	public static void main(String args[]) throws Exception {

		/* Location of XML File */
		String XMLLocation = "C:/myXMLFile.xml";

		ObjectSerializationToXML serializer = new ObjectSerializationToXML();

		/* Creating and filling a bean object */
		MyBeanToSerialize obj = new MyBeanToSerialize();
		obj.setFirstName("Johnny");
		obj.setLastName("Depp");
		obj.setAge(45);

		/* Serialzing Object to XML */
		System.out.println("Starting Serialization...");
		serializer.serializeObjectToXML(XMLLocation, obj);
		System.out.println("Serialized Object: " + obj.getClass().getName());
		System.out.println("Destination XML: " + XMLLocation);

		/* Reading the object from serialized XML */
		System.out.println("nnStarting De-Serialization...");
		System.out.println("Source XML: " + XMLLocation);
		MyBeanToSerialize deserializedObj = (MyBeanToSerialize) serializer
				.deserializeXMLToObject(XMLLocation);
		System.out.println("De-serialized Object: "
				+ deserializedObj.getClass().getName());
		System.out.println("nChecking For Values In De-Serialized Object");
		System.out.println("...First Name: " + deserializedObj.getFirstName());
		System.out.println("...Last Name: " + deserializedObj.getLastName());
		System.out.println("...Age: " + deserializedObj.getAge());

	}

}

The following is the java bean that will be serialized / deserialized.

package com.kushal.serialization;
/**
 * @author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modified On: 10th September 2009
 *
 * Simple Java Bean
 */
public class MyBeanToSerialize {
	private String firstName;
	private String lastName;
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

}

================================
Output of running the file ObjectSerializationToXML
Starting Serialization…
Serialized Object: com.kushal.serialization.MyBeanToSerialize
Destination XML: C:/myXMLFile.xml

Starting De-Serialization…
Source XML: C:/myXMLFile.xml
De-serialized Object: com.kushal.serialization.MyBeanToSerialize

Checking For Values In De-Serialized Object
…First Name: Johnny
…Last Name: Depp
…Age: 45

The content of the generated XML File: