Create user object in SAX parser handler in Java
Description
The following code shows how to create user object in SAX parser handler.
Example
import java.io.StringReader;
import java.util.Vector;
/*from w w w . jav a 2 s . com*/
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
public class Main {
public static void main(String args[]) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader reader = null;
SAXParser parser = spf.newSAXParser();
reader = parser.getXMLReader();
reader.setErrorHandler(new MyErrorHandler());
reader.setContentHandler(new MyTextHandler());
StringReader sr = new StringReader("<folks><person><phone>502 555-2192</phone><name>B, M</name></person></folks>");
//InputSource is = new InputSource("xmlFileName.xml");
InputSource is = new InputSource(sr);
reader.parse(is);
}
}
class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException {
show("Warning", e);
throw (e);
}
public void error(SAXParseException e) throws SAXException {
show("Error", e);
throw (e);
}
public void fatalError(SAXParseException e) throws SAXException {
show("Fatal Error", e);
throw (e);
}
private void show(String type, SAXParseException e) {
System.out.println(type + ": " + e.getMessage());
System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber());
System.out.println("System ID: " + e.getSystemId());
}
}
class MyTextHandler implements ContentHandler {
private boolean insideNameElement = false;
private boolean insidePhoneElement = false;
private boolean insideEmailElement = false;
private Person person;
private Vector<Person> personVec;
public MyTextHandler() {
personVec = new Vector<Person>();
}
public void setDocumentLocator(Locator locator) {
}
public void startDocument() {
}
public void endDocument() {
for(int i=0; i<personVec.size(); i++) {
Person p = (Person)personVec.elementAt(i);
System.out.println(p.getName()+" "+p.getPhone()+" "+p.getEmail());
}
}
public void startPrefixMapping(String prefix,String uri) { }
public void endPrefixMapping(String prefix) { }
public void startElement(String namespaceURI,String localName,
String qName,Attributes atts) {
if(qName.equals("person")) {
person = new Person();
} else if(qName.equals("name")) {
insideNameElement = true;
} else if(qName.equals("phone")) {
insidePhoneElement = true;
} else if(qName.equals("email")) {
insideEmailElement = true;
}
}
public void endElement(String namespaceURI,String localName,
String qName) {
if(qName.equals("person")) {
if(person != null){
personVec.addElement(person);
}
} else if(qName.equals("name")) {
insideNameElement = false;
} else if(qName.equals("phone")) {
insidePhoneElement = false;
} else if(qName.equals("email")) {
insideEmailElement = false;
}
}
public void characters(char[] ch,int start,int length) {
String str = "";
for(int i=start; i<start + length; i++)
str += ch[i];
if(insideNameElement)
person.setName(str);
else if(insidePhoneElement)
person.setPhone(str);
else if(insideEmailElement)
person.setEmail(str);
}
public void ignorableWhitespace(char[] ch,int start,int length) { }
public void processingInstruction(String target,String data) { }
public void skippedEntity(String name) { }
}
class Person {
private String name = null;
private String phone = null;
private String email = null;
public void setName(String value) {
name = value;
}
public void setPhone(String value) {
phone = value;
}
public void setEmail(String value) {
email = value;
}
public String getName() {
if(name == null)
return("none");
return(name);
}
public String getPhone() {
if(phone == null)
return("none");
return(phone);
}
public String getEmail() {
if(email == null)
return("none");
return(email);
}
}
The code above generates the following result.