A Content Handler to Output a Sorted List : SAX « XML « Java Tutorial






/*
Code revised from
Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002

*/


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

import javax.xml.parsers.ParserConfigurationException;
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 MappingContentHandler {
  static public void main(String[] arg) {
    try {
      SAXParserFactory spf = SAXParserFactory.newInstance();
      SAXParser parser = spf.newSAXParser();
      XMLReader reader = parser.getXMLReader();
      reader.setErrorHandler(new MyErrorHandler());
      MyTextHandler duper = new MyTextHandler();
      reader.setContentHandler(duper);
      InputSource is = new InputSource("person.xml");
      reader.parse(is);
    } catch (SAXException e) {
      System.out.println(e);
    } catch (ParserConfigurationException e) {
      System.err.println(e);
      System.exit(1);
    } catch (IOException e) {
      System.err.println(e);
      System.exit(1);
    }
  }
}

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);
  }
}
//File: person.xml
<?xml version="1.0" standalone="yes"?>

<folks>
    <person>
        <phone>999 555-8888</phone>
        <email>e@yoursite.net</email>
        <name>R, L</name>
    </person>
    <person>
        <phone>333 555-9910</phone>
        <name>V, R</name>
        <email>rv@yoursite.com</email>
    </person>
    <person>
        <name>B, D.</name>
        <email>b@xyz.net</email>
    </person>
    <person>
        <phone>502 555-2192</phone>
        <name>B, M</name>
    </person>
</folks>
R, L 999 555-8888 e@yoursite.net
V, R 333 555-9910 rv@yoursite.com
B, D. none b@xyz.net
B, M 502 555-2192 none








33.1.SAX
33.1.1.SAX parer with all its action displayed
33.1.2.SAX Error Checking: A Simple Implementation of the ErrorHandler Interface
33.1.3.The XMLReader interface
33.1.4.A Program to Display the Input from a SAX Parser: subclass ContentHandler
33.1.5.A Class to Convert SAX Parse Information into an XML Document
33.1.6.A Content Handler to Output a Sorted List
33.1.7.Generating SAX Parsing Events by Traversing a DOM Document
33.1.8.Intercepting All Accesses to External Entities During XML SAX Parsing
33.1.9.Accessing features of the SAX parser implementation
33.1.10.Handling SAX errors during parsing
33.1.11.Parsing XML with a simple SAX document handler
33.1.12.Configuring SAX parser factory to produce alternate parser
33.1.13.Using XML locator to indicate current parser position
33.1.14.Calling a .NET Web Service
33.1.15.Sax to DOM converter
33.1.16.Produce a SAX stream from a DOM Document