Java SAX 解析器

更新于 2025-12-28

Jakob Jenkov 2014-05-21

SAX 是 “Simple API for XML”(XML 简单 API)的缩写。Java SAX XML 解析器是一种流式 XML 解析器。它通过遍历 XML 文档,并在遇到 XML 的特定结构元素时,调用一个“监听器”对象中的某些方法来工作。

例如,当解析器在 XML 中遇到以下“事件”时,会调用监听器对象中的对应方法:

  • startDocument
  • startElement
  • characters
  • comments(注释)
  • processing instructions(处理指令)
  • endElement
  • endDocument

这个列表可能并不完整,但足以让你理解其工作原理。接下来,我们来看看如何创建和使用 Java SAX 解析器。

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 类的一个子类,而 DefaultHandler 是 JDK 自带的。

在解析 XML 的过程中,SAXParser 会根据在 XML 文件中发现的内容,调用 DefaultHandler 子类(这里是 SaxHandler)实例中的相应方法。为了响应这些调用,你需要在 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 {
    }
}

从 XML 中提取所需信息的责任完全落在 DefaultHandler 子类身上。如果你需要基于 XML 文件构建一个对象图(object graph),那么你必须在 DefaultHandler 子类内部完成这项工作。