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,以获取有关这些方法的更多详细信息。