Melanjutkan dari post saya tentang parsing XML dengan Java, pada entri sebelumnya teknik parsing yang digunakan dengan menggunakan DOM Parser. pada entri kali ini saya akan membahas bagaimana cara untuk mem-parsing XML dengan SAX parser.
pada entri kali ini kita tetap menggunakan XML dengan struktur yang sama dengan entri sebelumnya.
Berikut adalah penjelasan fungsi dari ketiga method tersebut secara simple:
membingungkan? pada awalnya, pengunaan SAX Parser pasti sangat membingunkan, namun penggunaan SAX Parser memberikan kita keleluasaan didalam melakukan penterjemahan terhadap dokumen XML yang akan kita.
pada entri kali ini kita tetap menggunakan XML dengan struktur yang sama dengan entri sebelumnya.
<?xml version="1.0" encoding="UTF-8"?> <personnel> <employee type="permanent"> <name>Seagull</name> <id>3674</id> <age>34</age> </employee> <employee type="contract"> <name>Robin</name> <id>3675</id> <age>25</age> </employee> <employee type="permanent"> <name>Crow</name> <id>3676</id> <age>28</age> </employee> </personnel>
pembacaan xml dengan SAX Parser sangat berbeda dengan pembacaan XML dengan cara DOM (Document Object Modeling), karena SAX Parser melakukan pembacaan melalui sebuah Handler. Pada Handler inilah semua tag yang menurut kita berarti akan diproses...
pada baris program dibawah ini class SAXParserExample merupakan class turunan dari DefaultHandler, dimana class DefaultHandler adalah sebuah abstract class yang mengharuskan class turunannya untuk melakukan overrides terhadap method-method berikut:
- public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
- public void characters(char[] ch, int start, int length) throws SAXException
- public void endElement(String uri, String localName, String qName) throws SAXException
Berikut adalah penjelasan fungsi dari ketiga method tersebut secara simple:
- method startElement merupakan entry point bagi parser didalam melakukan pembacaan tag. pada method ini kita dapat melakukan seleksi terhadap tag-tag apa yang akan kita proses maupun dengan melakukan pengecekan pada parameter qName
- method characters digunakan untuk membaca tag body, jika tag merupakan tag yang tidak mempunyai body maka method ini tidak akan memberikan parameter apapun alias kosong.
- method endElement merupakan method yang diakses oleh parser ketika parser menemukan penutup dari tag yang sebelumnya dibaca oleh startElement
import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.parsers.ParserConfigurationException; 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 SAXParserExample extends DefaultHandler{ List myEmpls; private String tempVal; //to maintain context private Employee tempEmp; public SAXParserExample(){ myEmpls = new ArrayList(); } public void runExample() { parseDocument(); printData(); } private void parseDocument() { //get a factory SAXParserFactory spf = SAXParserFactory.newInstance(); try { //get a new instance of parser SAXParser sp = spf.newSAXParser(); //parse the file and also register this class for call backs sp.parse("employees.xml", this); }catch(SAXException se) { se.printStackTrace(); }catch(ParserConfigurationException pce) { pce.printStackTrace(); }catch (IOException ie) { ie.printStackTrace(); } } /** * Iterate through the list and print * the contents */ private void printData(){ System.out.println("No of Employees '" + myEmpls.size() + "'."); Iterator it = myEmpls.iterator(); while(it.hasNext()) { System.out.println(it.next().toString()); } } //Event Handlers public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //reset tempVal = ""; if(qName.equalsIgnoreCase("Employee")) { //create a new instance of employee tempEmp = new Employee(); tempEmp.setType(attributes.getValue("type")); } } public void characters(char[] ch, int start, int length) throws SAXException { tempVal = new String(ch,start,length); } public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equalsIgnoreCase("Employee")) { //add it to the list myEmpls.add(tempEmp); }else if (qName.equalsIgnoreCase("Name")) { tempEmp.setName(tempVal); }else if (qName.equalsIgnoreCase("Id")) { tempEmp.setId(Integer.parseInt(tempVal)); }else if (qName.equalsIgnoreCase("Age")) { tempEmp.setAge(Integer.parseInt(tempVal)); } } public static void main(String[] args){ SAXParserExample spe = new SAXParserExample(); spe.runExample(); } }
membingungkan? pada awalnya, pengunaan SAX Parser pasti sangat membingunkan, namun penggunaan SAX Parser memberikan kita keleluasaan didalam melakukan penterjemahan terhadap dokumen XML yang akan kita.
Comments