RSS

Read XML in Java

07 Sep

First follow this post https://malalanayake.wordpress.com/2012/09/07/write-xml-in-java/

XmlReader.java

package mysamples;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlReader {

private String name;
 private String content;
 private Map<String, String> nameAttributes = new HashMap<String, String>();
 private Map<String, ArrayList<XmlReader>> nameChildren = new HashMap<String, ArrayList<XmlReader>>();

public XmlReader(InputStream inputStream, String rootName) {
 this(rootElement(inputStream, rootName));
 }

public XmlReader(String filename, String rootName) {
 this(fileInputStream(filename), rootName);
 }

public XmlReader(String rootName) {
 this.name = rootName;
 }

private XmlReader(Element element) {
 this.name = element.getNodeName();
 this.content = element.getTextContent();
 NamedNodeMap namedNodeMap = element.getAttributes();
 int n = namedNodeMap.getLength();
 for (int i = 0; i < n; i++) {
 Node node = namedNodeMap.item(i);
 String name = node.getNodeName();
 addAttribute(name, node.getNodeValue());
 }
 NodeList nodes = element.getChildNodes();
 n = nodes.getLength();
 for (int i = 0; i < n; i++) {
 Node node = nodes.item(i);
 int type = node.getNodeType();
 if (type == Node.ELEMENT_NODE) {
 XmlReader child = new XmlReader((Element) node);
 addChild(node.getNodeName(), child);
 }

}
 }

public void addAttribute(String name, String value) {
 nameAttributes.put(name, value);
 }

private void addChild(String name, XmlReader child) {
 ArrayList<XmlReader> children = nameChildren.get(name);
 if (children == null) {
 children = new ArrayList<XmlReader>();
 nameChildren.put(name, children);
 }
 children.add(child);
 }

public String name() {
 return name;
 }

public void setContent(String content) {
 this.content = content;
 }

public String content() {
 return content;
 }

public void addChild(XmlReader xml) {
 addChild(xml.name(), xml);
 }

public void addChildren(XmlReader... xmls) {
 for (XmlReader xml : xmls) {
 addChild(xml.name(), xml);
 }
 }

public XmlReader child(String name) {
 XmlReader child = optChild(name);
 if (child == null) {
 throw new RuntimeException("Could not find child node: " + name);
 }
 return child;
 }

public XmlReader optChild(String name) {
 ArrayList<XmlReader> children = children(name);
 int n = children.size();
 if (n > 1) {
 throw new RuntimeException("Could not find individual child node: " + name);
 }
 return n == 0 ? null : children.get(0);
 }

public boolean option(String name) {
 return optChild(name) != null;
 }

public ArrayList<XmlReader> children(String name) {
 ArrayList<XmlReader> children = nameChildren.get(name);
 return children == null ? new ArrayList<XmlReader>() : children;
 }

public String string(String name) {
 String value = optString(name);
 if (value == null) {
 throw new RuntimeException(
 "Could not find attribute: " + name + ", in node: " + this.name);
 }
 return value;
 }

public String optString(String name) {
 return nameAttributes.get(name);
 }

public int integer(String name) {
 return Integer.parseInt(string(name));
 }

public Integer optInteger(String name) {
 String string = optString(name);
 return string == null ? null : integer(name);
 }

public double doubleValue(String name) {
 return Double.parseDouble(optString(name));
 }

public Double optDouble(String name) {
 String string = optString(name);
 return string == null ? null : doubleValue(name);
 }

private static Element rootElement(InputStream inputStream, String rootName) {
 try {
 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder = builderFactory.newDocumentBuilder();
 Document document = builder.parse(inputStream);

Element rootElement = document.getDocumentElement();
 if (!rootElement.getNodeName().equals(rootName)) {
 throw new RuntimeException("Could not find root node: " + rootName);
 }
 return rootElement;
 } catch (IOException exception) {
 throw new RuntimeException(exception);
 } catch (ParserConfigurationException exception) {
 throw new RuntimeException(exception);
 } catch (SAXException exception) {
 throw new RuntimeException(exception);
 } finally {
 if (inputStream != null) {
 try {
 inputStream.close();
 } catch (Exception exception) {
 throw new RuntimeException(exception);
 }
 }
 }
 }

private static FileInputStream fileInputStream(String filename) {
 try {
 return new FileInputStream(filename);
 } catch (IOException exception) {
 throw new RuntimeException(exception);
 }
 }

}

Here I’m Reading the Employee.xml

public static void main(String[] args) {
XmlReader config = new XmlReader("Employee.xml", "employees");

System.out.println("title: " + config.child("employee").content());

for(XmlReader firstname : config.child("employee").children("firstname")){
System.out.println("First Name :" + firstname.content());
}

for(XmlReader firstname : config.child("employee").children("lastname")){
System.out.println("Last Name :" + firstname.content());
}

for(XmlReader firstname : config.child("employee").children("age")){
System.out.println("Age :" + firstname.content());
}

for(XmlReader firstname : config.child("employee").children("email")){
System.out.println("Email :" + firstname.content());
}

}

If You need to read something like this kind of xml you can do it in this way

<config>
	<title>test</title>
	<version
		major="1"
		minor="2"/>
	<roles>
		<role name="admin"/>
		<role name="user"/>
	</roles>
	<users>
		<user name="joe" password="pass" role="admin"/>
		<user name="harry" password="secret" role="user" email="harry@me.com"/>
	</users>
	<test/>
</config>
public static void main(String[] args) {
Xml config = new Xml("config.xml","config"); 
		
System.out.println("title: "+config.child("title").content());

Xml version = config.child("version");
System.out.println("version: "+version.integer("major")+"."+version.integer("minor"));

for(Xml role:config.child("roles").children("role")) 
	System.out.println("role: name: "+role.string("name"));

for(Xml user:config.child("users").children("user")) {
	String email = user.optString("email");
	System.out.println(
		"user: name: "+user.string("name")+
		", password: "+user.string("password")+
		", role: "+user.string("role")+
		", email: "+(email==null ? "-" : email));
}

System.out.println("test: "+config.option("test"));
}
Advertisements
 
Leave a comment

Posted by on September 7, 2012 in java

 

Tags: , ,

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

 
%d bloggers like this: