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

SAX parser is working differently with a DOM parser, it neither load any XML document into memory nor create any object representation of the XML document. Instead, the SAX parser use callback function (org.xml.sax.helpers.DefaultHandler) to informs clients of the XML document structure.


SAX Parser is faster and uses less memory than DOM parser.

See following SAX callback methods :

  • startDocument() and endDocument() – Method called at the start and end of an XML document.
  • startElement() and endElement() – Method called at the start and end of a document element.
  • characters() – Method called with the text contents in between the start and end tags of an XML document element.

1. XML file

Create a simple XML file.


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

2. Java file

Use SAX parser to parse the XML file.


import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLFile {

   public static void main(String argv[]) {

    try {

	SAXParserFactory factory = SAXParserFactory.newInstance();
	SAXParser saxParser = factory.newSAXParser();

	DefaultHandler handler = new DefaultHandler() {

	boolean bfname = false;
	boolean blname = false;
	boolean bnname = false;
	boolean bsalary = false;

	public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

		System.out.println("Start Element :" + qName);

		if (qName.equalsIgnoreCase("FIRSTNAME")) {
			bfname = true;
		}

		if (qName.equalsIgnoreCase("LASTNAME")) {
			blname = true;
		}

		if (qName.equalsIgnoreCase("NICKNAME")) {
			bnname = true;
		}

		if (qName.equalsIgnoreCase("SALARY")) {
			bsalary = true;
		}

	}

	public void endElement(String uri, String localName,
		String qName) throws SAXException {

		System.out.println("End Element :" + qName);

	}

	public void characters(char ch[], int start, int length) throws SAXException {

		if (bfname) {
			System.out.println("First Name : " + new String(ch, start, length));
			bfname = false;
		}

		if (blname) {
			System.out.println("Last Name : " + new String(ch, start, length));
			blname = false;
		}

		if (bnname) {
			System.out.println("Nick Name : " + new String(ch, start, length));
			bnname = false;
		}

		if (bsalary) {
			System.out.println("Salary : " + new String(ch, start, length));
			bsalary = false;
		}

	}

     };

       saxParser.parse("c:\\file.xml", handler);
 
     } catch (Exception e) {
       e.printStackTrace();
     }
  
   }

}

Result


Start Element :company
Start Element :staff
Start Element :firstname
First Name : yong
End Element :firstname
Start Element :lastname
Last Name : mook kim
End Element :lastname
Start Element :nickname
Nick Name : mkyong
End Element :nickname
Start Element :salary
Salary : 100000
End Element :salary
End Element :staff
Start Element :staff
Start Element :firstname
First Name : low
End Element :firstname
Start Element :lastname
Last Name : yin fong
End Element :lastname
Start Element :nickname
Nick Name : fong fong
End Element :nickname
Start Element :salary
Salary : 200000
End Element :salary
End Element :staff
End Element :company
Warning
This example may encounter exceptions for UTF-8 XML file, please read this article about how to read the XML “UTF-8” file in SAX
Note
You may interest to read this How to read XML file in Java – (DOM Parser)

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
86 Comment threads
24 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
83 Comment authors
Lakshya MunjalPradeepIt ItNAVEEN REDDY (NAVEE)Amit Thakur Recent comment authors
newest oldest most voted
Mark Tielemans
Guest
Mark Tielemans

You can keep track of open/closed elements much more gracefully using a Map:

Map<String, Boolean> elements = new HashMap<String, Boolean>();
</pre

onStart:
<pre lang="java">elements.put(qName, true);

onEnd:

elements.put(qName, false);

Nice guide!

mehfatiem
Guest
mehfatiem

How can I import org.xml.sax. … I use eclipse as a development kid. Where can I find to org.sax library.

Ap
Guest
Ap

I am trying to validate one xml , I am getting exception as cvc-elt.5.2.2.1:The value ’00’ of element ‘x’ does not match the fixed {value constraint}’0′. Can any one help to resolve this asap?

trackback
How to read XML file in Java - (DOM Parser) | Java

[…] If you want to compare different implementation between DOM and SAX, Please visit here for How to read XML file in Java – (SAX Parser) […]

Karthi
Guest
Karthi

while i try to compile the sax parser code i got the following error:

org.xml.sax.SAXParseException: Content is not allowed in prolog.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at com.mypack.ReadXMLFileSAX.main(ReadXMLFileSAX.java:99)

trackback
SAX Error – Content is not allowed in prolog | Java

[…] This is the Java’s example i used to read the XML file with SAX. […]

trackback
How to read UTF-8 XML file in Java – (SAX Parser) | Java

[…] Written on December 17, 2009 at 6:04 am by mkyong Here’s my previous article about how to read XML file in Java SAX Parser. The previous example is working fine to parse the plain text (ANSI) XML file, however, it may […]

trackback
How to read XML file in Java – (JDOM Example) | Misc

[…] You can compare the syntax with SAX and DOM parser in the following two examples – How to read XML file in Java – (SAX Parser) – How to read XML file in Java – (DOM […]

trackback
Java XML Tutorials | J2EE Web Development Tutorials

[…] Read XML file – (SAX Parser) Example to read a XML file with SAX parser. […]

PUCH
Guest
PUCH

I think that this is the best tutorial about SAX and XML!

🙂

sam
Guest
sam

On executing the code, I get “javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found”.

I’ve already added following JARs to classpath:
xercesImpl-2_9_1 , xml-apis-2_9_1

Any help is greatly appreciated !!

SJ
Guest
SJ

Perfect Hello World to see how to parse a file using SAX. Thank you!

trackback
android ?????? | ????

[…] ?SAX??xml?? […]

seyma
Guest
seyma

I tried to read xml file ( approx. 600 MB ) on 3.2GB RAM computer and i got outofmemory exception with XOM, VTD-XML ex. Only this code makes it successfully. Thank you

mahendra nadh
Guest
mahendra nadh

can u explain with an example what is the difference between SAX Parser and DOM Parser?

Rajat
Guest
Rajat

Hi,

Can anyone please tell me how to Parse multiple XML files and store the result in a single TEXT file.

Sagar
Guest
Sagar

I want to parse a content some thing like this. It is html formatted content. I want the values present in tags like name ,age,sex etc. How can I do that? Service: Employee File 10 records Company: A2B company Name Employee number Sex Age Designation Date Mark 1001 Male 25 Analyst 2005-02-01 ricky 1005 Male 28 Analyst 2008-12-01 David 1007 Male 35 SeniorAnalyst 2005-08-11 hilary 1008 female 28 maketing 2001-02-01

Sudar
Guest
Sudar

Hi

I work in Middle office and need to parse and write thousands of fixml messages. Can you please let me know the fastet xml parser some thing like that (10000/min) and share a tutorial

Thanks
Sudar

ShAlInI
Guest
ShAlInI

how to search xml file data based on the given keyword from html form using sax parser?

iceman
Guest
iceman

Very straightforward, simple example. Nice job.

suryadevi
Guest
suryadevi

super example

trackback
Tratamiento de XML en Java (lectura y escritura) | vidasConcurrentes

[…] A partir de esto podríamos, en lugar de escribir por pantalla los valores, procesarlos y crear atributos de objetos de clases que hayamos definido nosotros. Un ejemplo de esto se puede encontrar aquí. […]

Nidhi
Guest
Nidhi

hi

i am trying to find difference between two xml files please help me on this….

Annon
Guest
Annon

startElement and charachters methods,

I am wondering for these methods, is there any specific reason for using separate if-conditions than if-elseif ladder?

I used the if-elseif ladder and seems ok.

Thank you.

trackback
TCP Server programming in Java and Posgres « Summer and winter and springtime and harvest

[…] specifically, I’ll need an xml parser. Like this:LikeBe the first to like this […]

Sriram
Guest
Sriram

Hello mkyong, This is a very nice example to start off on knowing how to implement the SAX parser..thank you! ..there is a flaw in your example which may mislead people who are beginning to learn.. the flaw is that .. the boolean flags and the sysouts in the characters(..) method should ideally be in the endElement(..) method..this is because of the nature of SAX parser to handle large data in the text node…where the parser will recursively call character(..) method until the end tag is reached.. to verify just give a very large first name (about 10000+ chars) ..and… Read more »

trackback
Java SAX ile RSS Ay?klay?c? | Batuhan Bayrakç? > Ki?isel A? Sayfas?

[…] How to read XML file in Java – (SAX Parser) http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/ Geri ?zleme | Etiketler: callback, Java, parser, RSS, rss parser, […]

Smouth
Guest
Smouth

My code compiles but I get no output.
I have used both mkyong’s and Sriram’s code but could not get an output.
I placed flags within the code to check if certain section of code are reaches and it seems like it doesn’t enter any of the handler methods.

Powerslave
Guest
Powerslave

Your example is wrong. You must EXTEND the DefaultHandler class instead of giving parse() a separate instance. How would SAX know who to call back to otherwise?

To anyone still stuck with the example code: Extend DefaultHandler and call parse() as follows:

saxParser.parse("yourXMLFile.xml", this);
Saraswati
Guest
Saraswati

Dear Mkyong,

I found this website and the example very, very useful.
Thank you very much indeed!

best regards,
saraswati.