JAXP的SAX解析方式(理解过程)

2024-05-23 18:48

本文主要是介绍JAXP的SAX解析方式(理解过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.JAXP的DOM解析方式和SAX解析方式的区别:

1.DOM:在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

2.SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

2.JAXP的SAX解析(了解 解析的过程)

2.1* 只能做查询,不能做增删改。

2.2* SAX解析:解析器自动帮我们

1.* 解析器

1.* 获取解析器的工厂

2.* 获取解析器对象

3.* 解析XML(XML的文件的地址,事件处理器:DefaultHandler)         

2.* 事件处理器

* 自己编写的类,需要继承DefalutHandler类,重写三个方法。

* startElement()
* characters()
* endElement()

3. 图示:


4.代码示例:

<pre name="code" class="java">package cn.itcast.jaxp.sax;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 JaxpSaxTest {public static void main(String[] args) {try {run1();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 获取所有的解析内容* */public static void run1() throws Exception{//获取SAX的解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();//获取解析器SAXParser parser = factory.newSAXParser();//解析parser.parse("src/book2.xml", new MyHandler2());}
}/*** 获取作者标签文本*/
class MyHandler2 extends DefaultHandler{private boolean flag = false;//解析到作者标签时置为trueprivate int count = 0;@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if("作者".equals(qName)){flag = true;count++;}}/*** 控制characters的输出,只在解析坐着吧标签的时候才打印*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {//flag为true时才打印if(flag && count==1){String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//flag恢复到falseflag = false;}}/*** 自己事件处理器* 重名三方法* */
class MyHandler extends DefaultHandler{/*** 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("开始标签: " + qName);}/*** 只要解析到文本内容,就调用该方法*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串System.out.println(str);}/*** 解析到结束标签,默认调用该方法*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("结束标签: " + qName);}
}

 

2.3* SAX的解析原理:        

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,(边读边解析)

都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,

会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。


事件处理器由程序员编写,程序员通过事件处理器中方法的参数,

就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
















这篇关于JAXP的SAX解析方式(理解过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996367

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.