Java SAX解析器

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

SAX是缩写,表示"用于XML的简单API"。 Java SAX XML解析器是面向流的XML解析器。它通过遍历XML并在遇到XML的某些结构元素时调用"侦听器"对象上的某些方法来工作。例如,它将为以下"事件"调用侦听器对象:

- startDocument
- startElement
- characters
- comments
- processing instructions
- endElement
- endDocument

该列表可能不完整,但是足够长,可以使我们了解其工作原理。让我们继续看看如何创建和使用Java SAX Parser。

SAXParserFactory factory = SAXParserFactory.newInstance();
try {

    InputStream    xmlInput  = new FileInputStream("theFile.xml");
    SAXParser      saxParser = factory.newSAXParser();

    DefaultHandler handler   = new SaxHandler();
    saxParser.parse(xmlInput, handler);

} catch (Throwable err) {
    err.printStackTrace ();
}

当我们调用SAXParser.parse()方法时,SAX解析器将开始XML处理。作为参数传递给parse()方法的xmlInputInputStream是读取XML的地方。

注意正在创建的SaxHandler实例,并将其作为参数传递给parse()方法。 SaxHandler类是org.xml.sax.helpers.DefaultHandler类的子类。 JDK随附了DefaultHandler类。

在处理XML时,SAXParser会调用DefaultHandler子类(此处为SaxHandler)实例中的方法,这些实例与解析器在XML文件中找到的内容相对应。要对这些方法调用做出反应,我们可以覆盖DefaultHandler子类中的相应方法。这是一个例子:

public class SaxHandler extends DefaultHandler {

    public void startDocument() throws SAXException {
    }

    public void endDocument() throws SAXException {
    }

    public void startElement(String uri, String localName,
            String qName, Attributes attributes)
    throws SAXException {

    }

    public void endElement(String uri, String localName, String qName)
    throws SAXException {
    }

    public void characters(char ch[], int start, int length)
    throws SAXException {
    }

    public void ignorableWhitespace(char ch[], int start, int length)
    throws SAXException {
    }

}

DefaultHandler子类的责任是通过这些方法从XML中提取任何必要的信息。如果需要基于XML文件构建对象图,则必须在DefaultHandler子类内部构建该对象图。