返回

JAXP解析XML之SAX解析

后端







**概述** 

在上一章中,我们简单介绍了JAXP解析XML的DOM方法。这一章中,我们将介绍SAX方法。SAX是Simple API for XML的缩写,它是一种事件驱动的XML解析器,比DOM解析器更轻量级。SAX解析器不会将整个XML文档加载到内存中,而是逐个事件地解析XML文档。这使得SAX解析器非常适合处理大型XML文档。

**SAX解析器的工作原理** 

SAX解析器使用一种叫做回调函数的机制来处理XML文档。当解析器遇到XML文档中的某个元素时,它就会调用相应的回调函数。例如,当解析器遇到一个名为“person”的元素时,它就会调用一个名为“startElement”的回调函数。这个回调函数可以用来获取元素的属性和子元素。

**使用SAX解析XML的示例代码** 

```java
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxExample extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // 在遇到一个XML元素时调用
        System.out.println("Start element: " + qName);
        for (int i = 0; i < attributes.getLength(); i++) {
            System.out.println("Attribute: " + attributes.getQName(i) + " = " + attributes.getValue(i));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // 在遇到一个XML元素的结束标签时调用
        System.out.println("End element: " + qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // 在遇到一个XML元素的文本内容时调用
        String text = new String(ch, start, length);
        System.out.println("Text: " + text);
    }

    public static void main(String[] args) {
        // 创建一个SAX解析器
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();

            // 创建一个SAX事件处理器
            SaxExample handler = new SaxExample();

            // 解析XML文档
            parser.parse("example.xml", handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果

Start element: person
Attribute: id = 1
Attribute: name = John Doe
Text: John Doe
End element: person

总结

SAX解析器是一种轻量级的XML解析器,非常适合处理大型XML文档。SAX解析器使用一种叫做回调函数的机制来处理XML文档,当解析器遇到XML文档中的某个元素时,它就会调用相应的回调函数。我们可以通过实现DefaultHandler类来创建一个SAX事件处理器,然后使用SAXParserFactory类来创建SAX解析器,并使用SAXParser类的parse方法来解析XML文档。