📜  SAX Parser-创建XML文档(1)

📅  最后修改于: 2023-12-03 15:34:49.026000             🧑  作者: Mango

SAX Parser-创建XML文档

概述

SAX (Simple API for XML)是一种基于事件驱动的XML解析器,它扫描XML文档并按照元素的顺序触发一系列的事件,应用程序在处理完一个事件后,SAX解析器则丢弃它,继续扫描下一个元素,从而实现高效的XML解析。

SAX解析器的特点
  • 基于事件驱动,速度快,占用内存少,可以解析大型XML文件;
  • 只能读取XML文档,无法更新或修改;
  • 不能随机访问XML文档中的元素;
  • 无法处理XML文档中的实体引用;
创建XML文档的步骤
  1. 创建一个SAXParserFactory对象
  2. 创建一个SAXParser对象
  3. 编写一个DefaultHandler的子类
  4. 调用SAXParser的parse()方法
代码示例
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class CreateXMLUsingSAXParser {
    public static void main(String[] args) {
        try {
            //创建SAXParserFactory对象
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //创建SAXParser对象
            SAXParser parser = factory.newSAXParser();
            //创建MyHandler对象
            MyHandler handler = new MyHandler();
            //读取xml文件
            parser.parse(new File("example.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyHandler extends DefaultHandler {
    @Override
    public void startDocument() throws SAXException {
        System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.print("<" + qName);
        for (int i = 0; i < attributes.getLength(); i++) {
            System.out.print(" " + attributes.getQName(i) + "=\"" + attributes.getValue(i) + "\"");
        }
        System.out.print(">");
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.print(new String(ch, start, length));
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("</" + qName + ">");
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println();
    }
}
代码说明
  • 第1-16行:创建了一个CreateXMLUsingSAXParser类,其中的main函数中实现了创建SAXParserFactory对象、创建SAXParser对象、创建MyHandler对象以及解析XML文件的过程;
  • 第18-36行:创建了一个MyHandler类,实现了DefaultHandler类,重写了startDocument()、startElement()、characters()、endElement()和endDocument()方法,这里我们只是将XML文档中的节点以及对应的值输出到控制台,当然你也可以根据自己的需求进行其他操作;
  • 第9行:parse()方法接收一个File对象和一个DefaultHandler对象,这里我们传入了MyHandler的实例对象;
  • 第10行:调用parse()方法开始解析XML文档;
  • 第23-25行:输出XML文档的头部信息;
  • 第27-32行:输出XML文档的每一个开始标签及标签属性信息;
  • 第34-36行:输出XML文档的每一个结束标签信息;
  • 第38-40行:输出XML文档的尾部信息。