Java SAX DefaultHandler
org.xml.sax.helpers.DefaultHandler类是SAX 2.0中"侦听器"的基类。
如本教程中SAX的第一篇文章中简要显示的那样,我们将创建DefaultHandler的子类,并重写此子类中的某些继承的方法。在本文中,我将展示一个非常简单的DefaultHandler子类示例,该子类仅打印出有关XML文件的详细信息。这是代码:
public class SaxHandler extends DefaultHandler {
public void startDocument() throws SAXException {
System.out.println("start document : ");
}
public void endDocument() throws SAXException {
System.out.println("end document : ");
}
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
System.out.println("start element : " + qName);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("end element : " + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
System.out.println("start characters : " +
new String(ch, start, length));
}
}
当我们运行此代码时,以该文件为输入:
<root>
<child>
<grandchild>text 1</grandchild>
</child>
<child>
<grandchild>text 2</grandchild>
</child>
</root>
...我们将获得以下输出打印到System.out:
start document :
start element : root
characters :
start element : child
characters :
start element : grandchild
characters : text 1
end element : grandchild
characters :
end element : child
characters :
start element : child
characters :
start element : grandchild
characters : text 2
end element : grandchild
characters :
end element : child
characters :
end element : root
end document :
当处理上面显示的XML文件时,这是SAXParser在SaxHandler实例中调用相应方法的顺序。
我们可能已经注意到,有时characters()方法会打印出换行符。这是因为characters()方法由SAXParser调用,其空白字符位于父元素begin标记的末尾与子begin标记之间。换句话说,此处用点(...)标记的空格字符:
<root>...
....<child>
</child>
有时,在元素结束标签的末尾之后,直到下一个同级标签的末尾或者父元素的结束标签的末尾,还会有空白字符。
加工说明
DefaultHandler类还具有一种用于在XML文件中找到XML处理指令时的方法。该方法的外观如下:
public void processingInstruction(String target, String data)
throws SAXException {
}
我们不太经常使用处理指令,因此在这里我不会对此进行更详细的介绍。现在我们已经知道它在这里了,我们可以自己玩。
例外情况
DefaultHandler类具有三个方法,我们可以重写这些方法来处理XML解析期间遇到的异常。他们来了:
public void warning(SAXParseException e) throws SAXException {
}
public void error(SAXParseException e) throws SAXException {
}
public void fatalError(SAXParseException e) throws SAXException {
}
假设解析器遇到非法的XML实体(例如¬Legal;)。然后,在中断解析之前,SAXParser将调用fatalError()方法。
如果发生危险程度较小的错误,则SAXParser可能只调用error()或者warning()方法。这样,我们可以收集列表中的所有错误,并在遇到错误时立即将其全部返回,而不是一个接一个地返回。
添加方法
DefaultHandler有更多可以重写的方法。请查看JavaDoc,以获取有关这些方法的更多详细信息。

