java使用SAX解析XML文件

本文介绍了XML作为数据描述和传递技术的用途,并详细讲解了SAX解析XML的原理和优势。SAX是一种轻量级、快速的XML解析方法,通过事件驱动模型处理数据流。在Java中,通过创建SAX解析器工厂、解析器实例和事件监听器来实现XML的解析。SAX的特点包括基于事件驱动、顺序读取、内存占用小,尤其适合对性能要求高的环境,如Android开发。
摘要由CSDN通过智能技术生成

XML (Extensible Markup Language可扩展标记语言),XML是一个以文本来描述数据的文档。
XML技术的用途:
(1)充当显示数据(以XML充当显示层)
(2)存储数据(存储层)的功能
(3)以XML描述数据,并在联系服务器与系统的其余部分之间传递。

从某种角度讲,XML是数据封装和消息传递技术。

SAX解析XML
SAX是Simple API for XML的缩写
SAX是读取和操作XML数据更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及DOM所必需的开销和概念跳跃。SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会被抛弃。

SAX API中主要有四种处理事件的接口,它们分别是ContentHandler, DTDHandler, EntityResolver和ErrorHandler。实际上只要继承DefaultHandler类就可以,DefaultHandler实现 了这四个事件处理器接口,然后提供了每个抽象方法的默认实现。

//创建SAX解析器工厂对象
SAXParserFactory spf = SAXParserFactory.newInstance();
//使用解析器工厂创建解析器实例
SAXParser saxParser = spf.newSAXParser();
//创建SAX解析器要使用的事件侦听器对象
PersonHandler handler=new PersonHandler();
//开始解析文件
saxParser.parse(new File(fileName), handler);

SAX解析特点:
1、基于事件驱动
2、顺序读取,速度快
3、不能任意读取(灵活性差)
4、解析时占用的内存小
5、更适合于在性能要求更高的设备上使用(Android开发中)

代码示例:
主类:

package com.booy;

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class XMLParserDemo {
   
    public static void main(String[] args) {
   
        //创建一个解析器工厂对象
        SAXParserFactory spf = SAXParserFactory.newInstance();
        //创建一个解析器对象
        try {
   
            SAXParser saxParser = spf.newSAXParser();
            //创建数据处理器
            PersonHandler personHandler = new PersonHandler();
            //解析文件
            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/booy/person.xml");
            saxParser.parse(in,personHandler);
            List<Person> persons = personHandler.getPerson();
            //遍历打印
            for(Person p:persons){
   
                System.out.println(p);
            }
        } catch (ParserConfigurationException e) {
   
            e.printStackTrace();
        } catch 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值