How to read XML file in Java – (DOM Parser)

In this tutorial, we will show you how to read an XML file via DOM XML parser. DOM parser parses the entire XML document and loads it into memory; then models it in a “TREE” structure for easy traversal or manipulation.

In short, it turns a XML file into DOM or Tree structure, and you have to traverse a node by node to get what you want.

What is Node?
In the DOM, everything in an XML document is a node, read this.
Warning
DOM Parser is slow and consumes a lot of memory when it loads an XML document which contains a lot of data. Please consider SAX parser as solution for it, SAX is faster than DOM and use less memory.

1. DOM XML Parser Example

This example shows you how to get the node by “name”, and display the value.

/Users/mkyong/staff.xml

<?xml version="1.0"?>
<company>
	<staff id="1001">
		<firstname>yong</firstname>
		<lastname>mook kim</lastname>
		<nickname>mkyong</nickname>
		<salary>100000</salary>
	</staff>
	<staff id="2001">
		<firstname>low</firstname>
		<lastname>yin fong</lastname>
		<nickname>fong fong</nickname>
		<salary>200000</salary>
	</staff>
</company>
ReadXMLFile.java

package com.mkyong.seo;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile {

  public static void main(String argv[]) {

    try {

	File fXmlFile = new File("/Users/mkyong/staff.xml");
	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	Document doc = dBuilder.parse(fXmlFile);
			
	//optional, but recommended
	//read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
	doc.getDocumentElement().normalize();

	System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
			
	NodeList nList = doc.getElementsByTagName("staff");
			
	System.out.println("----------------------------");

	for (int temp = 0; temp < nList.getLength(); temp++) {

		Node nNode = nList.item(temp);
				
		System.out.println("\nCurrent Element :" + nNode.getNodeName());
				
		if (nNode.getNodeType() == Node.ELEMENT_NODE) {

			Element eElement = (Element) nNode;

			System.out.println("Staff id : " + eElement.getAttribute("id"));
			System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
			System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
			System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
			System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());

		}
	}
    } catch (Exception e) {
	e.printStackTrace();
    }
  }

}

Result


Root element :company
----------------------------

Current Element :staff
Staff id : 1001
First Name : yong
Last Name : mook kim
Nick Name : mkyong
Salary : 100000

Current Element :staff
Staff id : 2001
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000

2. Looping the Node

This example reads the same "staff.xml", and showing you how to loop the node one by one, and print out the node name and value, and also the attribute if any.

ReadXMLFile2.java

package com.mkyong.seo;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile2 {

  public static void main(String[] args) {

    try {

	File file = new File("/Users/mkyong/staff.xml");

	DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
                             .newDocumentBuilder();

	Document doc = dBuilder.parse(file);

	System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

	if (doc.hasChildNodes()) {

		printNote(doc.getChildNodes());

	}

    } catch (Exception e) {
	System.out.println(e.getMessage());
    }

  }

  private static void printNote(NodeList nodeList) {

    for (int count = 0; count < nodeList.getLength(); count++) {

	Node tempNode = nodeList.item(count);

	// make sure it's element node.
	if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

		// get node name and value
		System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
		System.out.println("Node Value =" + tempNode.getTextContent());

		if (tempNode.hasAttributes()) {

			// get attributes names and values
			NamedNodeMap nodeMap = tempNode.getAttributes();

			for (int i = 0; i < nodeMap.getLength(); i++) {

				Node node = nodeMap.item(i);
				System.out.println("attr name : " + node.getNodeName());
				System.out.println("attr value : " + node.getNodeValue());

			}

		}

		if (tempNode.hasChildNodes()) {

			// loop again if has child nodes
			printNote(tempNode.getChildNodes());

		}

		System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

	}

    }

  }

}

Result :


Root element :company

Node Name =company [OPEN]
Node Value =
	
		yong
		mook kim
		mkyong
		100000
	
	
		low
		yin fong
		fong fong
		200000
	


Node Name =staff [OPEN]
Node Value =
		yong
		mook kim
		mkyong
		100000
	
attr name : id
attr value : 1001

Node Name =firstname [OPEN]
Node Value =yong
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =mook kim
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =mkyong
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =100000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]

Node Name =staff [OPEN]
Node Value =
		low
		yin fong
		fong fong
		200000
	
attr name : id
attr value : 2001

Node Name =firstname [OPEN]
Node Value =low
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Value =yin fong
Node Name =lastname [CLOSE]

Node Name =nickname [OPEN]
Node Value =fong fong
Node Name =nickname [CLOSE]

Node Name =salary [OPEN]
Node Value =200000
Node Name =salary [CLOSE]
Node Name =staff [CLOSE]
Node Name =company [CLOSE]
Note
You may interest at this How to get Alexa Ranking In Java. It shows you how to use DOM to parse the Alexa XML result.

References

  1. When to Use DOM
  2. Normalization in DOM parsing with java - how does it work?
  3. Learn XML DOM
  4. What is Node?
  5. What is Element?

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

avatar
152 Comment threads
44 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
145 Comment authors
xXxLa RanobodychaitanyaAndres Recent comment authors
newest oldest most voted
pandi
Guest
pandi

what is the use of normalize() please explain about that method?

Serch
Guest
Serch

TE AMO!!!

Rakesh Sonu
Guest
Rakesh Sonu

boss getTextContent() is throwning an error .May i know what i need to do.

Andres
Guest
Andres

public void leerXMLDom() throws ParserConfigurationException, SAXException, IOException, TransformerException {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File fichero = new File(“nuevo.xml”);
Document doc = builder.parse(fichero);
Node raiz = doc.getFirstChild();
this.procesarXML(raiz);
this.addNodoDiv(doc);
this.guardarDOMcomoFILE(doc);
}

private void procesarXML(Node nodo) {

NodeList nodosHijo = nodo.getChildNodes();
System.out.print(“<" + nodo.getNodeName());
NamedNodeMap atributos = nodo.getAttributes();
for (int i = 0; i n”);
String valorNodo = nodo.getFirstChild().getNodeValue();
if (valorNodo != null) {
System.out.println(valorNodo);
}
for (int i = 0; i 0) {
this.procesarXML(nodoHijo);
}
}
System.out.println(“”);
}

Alee
Guest
Alee

thnx man its a great code for me thnx…

trackback
Normalization in DOM parsing with java – how does it work? | Ask Programming & Technology

[…] saw the line below in code for a DOM parser at http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ – […]

Ramanan
Guest
Ramanan

Thanks, nice and simple example.
I have little problem with attribute names contains colon.

eg.
en
Unknown

Output for above lines only show the value not the attribute name. Please clarify me how to get attribute value.

Ramanan
Guest
Ramanan

Sorry, I forget to format source code.

eg.

en
Unknown

Sudhir
Guest
Sudhir

It’s really help full for me.

MF
Guest
MF

Hello,

This is a great tutorial, with a clear illustration on xml parsing and great start for all the beginners. I have a quick question, if we want to approach this on to the xml format which have name/value pair like example

I would really appreciate if you could provide a sample code on how to parse the key value pair, i am looking to update the values in the xml on the run time. Your early response and valuable answer will be highly appreciated!
Thanks in advance.

wasim
Guest
wasim

thanks …
this is what i need …

Kugelmaus
Guest
Kugelmaus

Thanks for this very easy introduction in javaXml. Better than some books about it

saleh
Guest
saleh

For what we need to use the second way “Looping the Node”?. I a beginner in this topic. The first way “DOM XML Parser Example” presents beautiful output.

nirmal
Guest
nirmal
Volker
Guest
Volker

THX very much, great tutorial!

Pedro Costa
Guest
Pedro Costa

The tag:
Motherboard

Pedro Costa
Guest
Pedro Costa

Hello,

I need some help about this great tutorial.
How can I get the value from this tag:
Motherboard

nobody
Guest
nobody

node.getNodeValue();

Medeea
Guest
Medeea

Thanks! Exactly what I needed!

falix
Guest
falix

Thanks…Thanks very much for this!!

ajay
Guest
ajay

how to read xml file data that is placed in remote server such that we know the url
and it is also admin and password protected

give some soluction

Ram
Guest
Ram

Hi. I am having XML structure as like you. How to handle null pointer exception when there is no field “firstname” in the xml ?

Ram
Guest
Ram

Hi. I am having XML structure as like you. How to handle null pointer exception when no is there in one iteration ?

mingrui
Guest
mingrui

This is really helpful and works very well.
Thank you so much!

trackback
Java XML Tutorial | Dev Solver

[…] Read a XML file Read a XML file and print it out each elements. […]

trackback
How to count the depth of xml document (DOM example)

[…] How To Read XML File In Java – (DOM Parser) […]

Peter
Guest
Peter

Thank you for the great explanation. Really help me a lot understanding the creation of reuse of a xml file in Java.

Following your example from creating to reading a xml file I think I found some inconsistency.

In the creating code you are doing this:

// staff elements
Element staff = doc.createElement(“Staff”);
rootElement.appendChild(staff);

But the xml reader class searches fpr attribute like this:

// searches for “Staff” instead of “staff”
NodeList nList = doc.getElementsByTagName(“staff”);

In my opinion you should change that as it cost me some time to find that little difference.

Anyways, thank you very much.

trackback
parse String to XML | Coisas de software

[…] Referências Javadoc Interface Document How To Read XML File In Java – (DOM Parser) […]

rahul
Guest
rahul

i had changed position of the code if (tempNode.getNodeType() == Node.ELEMENT_NODE) { // get node name and value System.out.println(“\nNode Name =” + tempNode.getNodeName() + ” [OPEN]”+tempNode.hasChildNodes()); if (tempNode.hasChildNodes()) { // loop again if has child nodes printNote(tempNode.getChildNodes()); } System.out.println(“Node Value =” + tempNode.getTextContent()); } my xml is myPublication0 myPublication my book myPublication1 myPublication2 my book2asd I got output like this Node Name =book [OPEN]true Node Name =Publication [OPEN]true Node Value = myPublication0 Node Name =Publication [CLOSE] Node Name =Publication [OPEN]true Node Name =bookName [OPEN]true Node Value = my book Node Name =bookName [CLOSE] Node Value = myPublication my book Node… Read more »

rahul
Guest
rahul

http://www.daniweb.com/software-development/java/threads/453086/read-xml
also please tell me the solution related to above problem

rahul
Guest
rahul

nice tutorial Mr. yong
why we use if (tempNode.getNodeType() == Node.ELEMENT_NODE) and what is purpose of tempNode.getNodeType().I am asking this question because when if print tempNode.getNodeType() i will get numeric one(1)
thanks

TukTuk
Guest
TukTuk

I am able to resolve the error by header information.

connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod(“GET”);
connection.setRequestProperty(“Host”, “www.gulfair.com”);
connection.setRequestProperty(“Accept”, “text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”);
connection.setRequestProperty(“User-Agent”, ” Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0″);
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);

DocumentBuilder db = dbf.newDocumentBuilder();
//parse using builder to get DOM representation of the XML file
Document dom = db.parse(connection.getInputStream());