Java HTML / XML How to - Extend DefaultHandler and use XML locator to indicate current parser position








Question

We would like to know how to extend DefaultHandler and use XML locator to indicate current parser position.

Answer

import java.io.StringReader;
/* ww  w  .  j  ava 2 s  .  c o  m*/
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Main {
  public static String getXMLData() {
    return "<x></x>";
  }

  public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser parser = factory.newSAXParser();
    parser.parse(new InputSource(new StringReader(getXMLData())),
        new SampleOfXmlLocator());
  }
}

class SampleOfXmlLocator extends DefaultHandler {
  private Locator locator;

  public void setDocumentLocator(Locator locator) {
    this.locator = locator;
  }

  public void startElement(String uri, String localName, String qName,
      Attributes attrs) throws SAXException {
    if (qName.equals("order")) {
      System.out.println("here process element start");
    } else {
      String location = "";
      if (locator != null) {
        location = locator.getSystemId(); // XML-document name;
        location += " line " + locator.getLineNumber();
        location += ", column " + locator.getColumnNumber();
        location += ": ";
      }
      throw new SAXException(location + "Illegal element");
    }
  }

}