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.SAXParserFactorySAX分析器工程类,主要作用于实例化SAXParser类对象
javax.xml.parsers.SAXParserSAX解析器,主要用于解析xml文件
org.xml.sax.helpers.DefaultHandler处理不同触发事件的操作

触发事件

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

在这里插入图片描述

  • 程序员或用户可以定义一个专门处理这些事件的程序类,这个类必须继承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进行解析的时候,是一行一行按照顺序进行解析的,所以适合读取大型的xml文件.

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值