SAX基本概念

  • DOM解析的优点是读取小型文件速度快,可以对xml文件数据进行修改,但是DOM解析最大的缺点就是占用内存高,每次需要将DOM树加载到内存中.
  • 为了解决DOM解析的缺点,可以使用SAX解析技术来对xml文档进行解析.
  • SAX解析(Simple API for XML),并不是w3c官方的标准.SAX解析与DOM解析不同的是,SAX解析采用的是将逐行顺序解析,按照文件的顺序,读一行解析一行的方式解析xml文件,因此相对来说比较快捷,也可以读取大型xml文件,但是SAX不能够只能够进行xml文件的读取,不能够进行增删改操作.

SAX解析的初步实现

  • 实现SAX解析所需要的核心类
javax.xml.parsers.SAXParserFactory SAX分析器工程类,主要作用于实例化SAXParser类对象
javax.xml.parsers.SAXParser SAX解析器,主要用于解析xml文件
org.xml.sax.helpers.DefaultHandler 处理不同触发事件的操作

触发事件

  • SAX解析器在解析xml文件的时候,会将每次触发的事件交给程序,例如,在解析到xml文档的时候,就有文档开始触发,读取到xml文件中一个开始元素时,就会有元素开始触发,有些事件只会触发一次,有些事件会触发多次.

SAX基本概念

  • 程序员或用户可以定义一个专门处理这些事件的程序类,这个类必须继承DefaultHandler这个类,并根据需要覆写对应的方法.
  • 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

定义解析器

  • 定义TestSAXParser类处理事件操作
package mao.shu.test;

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

import java.lang.reflect.Array;
import java.util.Arrays;

public class TestSAXParser extends DefaultHandler {
    @Override
    public void startDocument() throws SAXException {
        System.out.println("SAX解析器开始解析xml文件");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("开始读取元素 xml文件 = "+uri+" , 标签名称 = "+localName+" , qName = "+qName+"属性 = "+attributes);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("读取元素结束 xml文件 = "+uri+" , 标签名称 = "+localName+" , qName = "+ qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
       // System.out.println("字符内容为 = "+ new String(ch));
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("文档读取结束");
    }
}


  • 创建TestParser类,解析info.xml文件
    • 原xml文件
<?xml version="1.0" encoding="utf-8" standalone="no"?><shop>
	<pen>
		<type>钢笔</type>
		<manufacturers id="9567">长城牌</manufacturers>
		<tradePrice>0.5</tradePrice>
		
	</pen>
	<book>
		<name>新的世界,新的你</name>
		<year>3</year>
		<price>56.6</price>
	</book>
	<book>
		<name>java入门到跑路</name>
		<year>111</year>
		<price>100</price>
	</book>
</shop>
  • TestParser类
package mao.shu.test;


import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;

public class TestParser extends DefaultHandler {
    public static void main(String[] args) throws Exception{
        //创建SAX解析器
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        SAXParser saxParser = saxParserFactory.newSAXParser();

        //定义原xml文件
        File xmlFIle = new File("e:"+File.separator+"testWeb"+File.separator+"info.xml");
        saxParser.parse(xmlFIle,new TestSAXParser());
    }
}

  • 运行结果

SAX基本概念

  • 从解析过程中可以发现,SAX进行解析的时候,是一行一行按照顺序进行解析的,所以适合读取大型的xml文件.