Java SAX DefaultHandler

时间:2020-01-09 10:36:30  来源:igfitidea点击:

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实体(例如&notLegal;)。然后,在中断解析之前,SAXParser将调用fatalError()方法。

如果发生危险程度较小的错误,则SAXParser可能只调用error()或者warning()方法。这样,我们可以收集列表中的所有错误,并在遇到错误时立即将其全部返回,而不是一个接一个地返回。

添加方法

DefaultHandler有更多可以重写的方法。请查看JavaDoc,以获取有关这些方法的更多详细信息。