2011年11月14日 星期一

Simple XML parser use sax

This is a small XML parser using sax.

If you only have one or two xmls to handle in your system, it's quick and simple.

import java.io.ByteArrayInputStream; import java.io.CharArrayWriter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; public class MyParser { public static void main(String... args) { String xml = "<root>" + "<employee><name>David</name><phone>1234</phone></employee>"+ "<employee><name>Luke</name><phone>9998</phone></employee>"+ "<employee><name>Mark</name><phone>5678</phone></employee>"+ "</root>"; MyParser parser = new MyParser(); List result = parser.parse(new ByteArrayInputStream(xml.getBytes())); for(Employee e : result){ System.out.println(e); } } public List parse(InputStream inputStream) { try { XMLReader xmlReader = XMLReaderFactory.createXMLReader(); EmployeeHandler handler = new EmployeeHandler(); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(inputStream)); return handler.getEmployeeList(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private class EmployeeHandler extends DefaultHandler { private CharArrayWriter contents = new CharArrayWriter(); private List employeeList = new ArrayList(); private String ename; private String ephone; public List getEmployeeList() { return employeeList; } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { contents.reset(); } @Override public void endElement(String uri, String localName, String name) throws SAXException { if ("name".equals(localName)) { ename = contents.toString(); return; } if ("phone".equals(localName)) { ephone = contents.toString(); return; } if("employee".equals(localName)){ Employee e = new Employee(); e.setName(ename); e.setPhone(ephone); employeeList.add(e); return; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { contents.write(ch, start, length); } } }
Employee POJO
class Employee { private String name; private String phone; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String toString(){ return ToStringBuilder.reflectionToString(this); } }

沒有留言:

張貼留言