This example will show you how to parse an XML file using SAX parser and build an object graph from the parsed XML. We will read the records.xml
file that contains some recording information and create the Record
object from it.
The DefaultHandler
in this example created as an anonymous class. We override some method related to the ContentHandler
interface such as the startElement
, endElement
and characters
methods.
package org.kodejava.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.kodejava.xml.support.Record;
public class SAXDataDemo {
// List of our records.
private final List<Record> records = new ArrayList<>();
// Stacks for storing the elements and objects.
private final Stack<String> elements = new Stack<>();
private final Stack<Record> objects = new Stack<>();
public static void main(String[] args) {
SAXDataDemo demo = new SAXDataDemo();
demo.run();
}
private void run() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
String filename = "/records.xml";
InputStream is = getClass().getResourceAsStream(filename);
parser.parse(is, new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
elements.push(qName);
if ("record".equals(qName)) {
Record record = new Record();
objects.push(record);
records.add(record);
}
}
@Override
public void endElement(String uri, String localName,
String qName) throws SAXException {
elements.pop();
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String value = new String(ch, start, length);
if (value.length() == 0) {
return;
}
if ("title".equals(currentElement())) {
Record record = objects.peek();
record.setTitle(value);
} else if ("artist".equals(currentElement())) {
Record record = objects.peek();
record.setArtist(value);
} else if ("genre".equals(currentElement())) {
Record record = objects.peek();
record.setGenre(value);
} else if ("year".equals(currentElement())) {
Record record = objects.peek();
record.setYear(Integer.parseInt(value));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
for (Record record : records) {
System.out.println("record = " + record);
}
}
private String currentElement() {
return elements.peek();
}
}
The Record class.
package org.kodejava.xml.support;
public class Record {
private String title;
private String artist;
private String genre;
private int year;
public Record() {
}
public void setTitle(String title) {
this.title = title;
}
public void setArtist(String artist) {
this.artist = artist;
}
public void setGenre(String genre) {
this.genre = genre;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Record{" +
"title='" + title + "'\n" +
", artist='" + artist + "'\n" +
", genre='" + genre + "'\n" +
", year=" + year +
'}';
}
}
The following XML is the content of our records.xml file.
<?xml version="1.0"?>
<root>
<records>
<record>
<title>Brand New Eyes</title>
<artist>Paramore</artist>
<genre>Punk Rock</genre>
<year>2011</year>
</record>
<record>
<title>Rock Beatles</title>
<artist>Various Artist</artist>
<genre>Rock</genre>
<year>2010</year>
</record>
</records>
</root>
When we run this example will get the following output:
record = Record{title='Brand New Eyes'
, artist='Paramore'
, genre='Punk Rock'
, year=2011}
record = Record{title='Rock Beatles'
, artist='Various Artist'
, genre='Rock'
, year=2010}
Latest posts by Wayan (see all)
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024