简单SAX解析详解全过程

利用Dom,Sax,Pull三种方式解析xml文件 最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子. 解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这三种解析方式之间的优缺点以及使用情况,先说一下这三种方式的优缺点和使用情况吧: 其实dom,sax,pull之间的优缺点网上有很多,讲的搞不好比我的还要深入和贴切,不过还是要说一下,毕竟自己以后还 阅读详情

简单SAX解析详解全过程

**1.来自百度百科**
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。

原理
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

大多数SAX实现都会产生以下类型的事件:
在文档的开始和结束时触发文档处理事件。
在文档内每一XML元素接受解析的前后触发元素事件。
任何元数据通常都由单独的事件交付。
在处理文档的DTD或Schema时产生DTD或Schema事件。
产生错误事件用来通知主机应用程序解析错误。

2.转载一篇
SAX解析:
Java JDK自带的解析(SAXParserFactory SAXPaeser DefaultHandler)
特点:一行一行的往下面执行解析的
startDocment startelement characters endElement endDocment

解析步骤:
 1.创建一个SAXParserFactory对象
    SAXParserFactory factory=SAXParserFactory.newInstance();

 2.获得解析器    
    SAXParser parser=factory.newSAXParser();

 3.调用解析方法解析xml,这里的第一个参数可以传递文件、流、字符串、需要注意第二个参数(new DefaultHander)
    File file=new File("girls.xml");
    parser.parse(file,new DefaultHandler());
    /**注解:--->这里的DefaultHandler表示
    DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、
    ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,
    可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法,所以在这之前我们先定义一个用于实现解析
    方法如下:*/

 4.创建一个MyHandler类来继承DefaultHandler并重写方法
    //定一个名为MyHandler类用来继承DefaultHandler
    (1)MyHandler extends DefaultHander
    (2)重写方法,快速记住方法(2个开始,2个结束,1一个文字(charactor--里面的内容))
    (3)2个开始:StartDocment(文档的开始)StartElement(元素的开始) 2个结束:endElement(元素的结束)
     endDocment(文档的结束,标志着xml文件的结束) 1个文字内容:charactor(文字内容)

 5.创建一个集合把所解析的内容添加到集合
    //分析:目的我们只是需要把xml里面的文字内容添加到我们的集合而不需要其他元素,所以我们需要进行判断得到
    //(接上)我们需要的内容(下面会赋一个图帮助理解)

 6.接步骤三 输出集合System.out.pritnln(list); 解析完成!

记住这张图:
在这里插入图片描述
一个列子:
我们将对这个xml文件进行SAX解析
在这里插入图片描述
第一步初始化一个Girl类:

/**
 *老套路 封装属性 setter getter toString
 * @author sKy°
 * @date 2016-5-5
 * @version 1.0
 */
public class Girl {
    private String id;
    private String name;
    private String age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Girl [name=" + name + ", age=" + age + "]";
    }
}

第二步继承DefaultHandler:

  • 继承Default
 * 一个用来处理girls 里面XML 数据的处理器 
 * 配合SAXParser一起使用 目标:想要将girls
 * 里面的数据,存在一个集合里面以备后面使用
 * 
 * 获取五种方法 
 * startDocment startElement
 *  characters endDocment endElement
 * @author sKy°
 * @date 2016-5-5
 * @version 1.0
 */
public class MyHandler extends DefaultHandler {
//  准备一个用于添加xml数据的集合、调用Girl类、准一个用于用来保存开始的标签的tag
    private List<Girl> girls;
    private Girl girl;
    private String tag;

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
//  因为这个方法只调用一次,所以在开始的时候就可以实例化集合
        girls=new ArrayList<>();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
//  这个方法,只有当开始一个元素的时候才会调用,
// 通过分析,当外部开始元素为girl的时候,需要将girl实例化

//      将tag赋值
        tag=qName;
        if ("girl".equals(qName)) {
            girl=new Girl();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        super.endElement(uri, localName, qName);
//      这句话,必须写,因为,当sax解析完一个元素的时候,会自动认为换行符是一个字符,会继续执行 character 方法 。如果不写,就会造成没有数据的现象。 
        tag="";

//      这个方法,当到了元素结尾的时候,会调用,应该在这里,将对象添加到集合里面去。
        if ("girl".equals(qName)) {
            girls.add(girl);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
//      这里是内容,但是,无法直接判断属于哪一个元素。
        String string = new String(ch, start, length);
        if ("name".equals(tag)) {//判断当前内容,属于哪一个元素。
            girl.setName(string);
        }else if ("age".equals(tag)) {
            girl.setAge(string);
        }//这两种情况,表示 当前语句执行在 girls 标签内。
    }

//       外部设置和获得值(getter setter)
    public List<Girl> getGirls() {
        return girls;
    }

    public void setGirls(List<Girl> girls) {
        this.girls = girls;
    }

    public Girl getGirl() {
        return girl;
    }

    public void setGirl(Girl girl) {
        this.girl = girl;
    }
}

第三步解析:

	 * SAX解析步骤
 * @author sKy°
 * @date 2016-5-5
 * @version 1.0
 */
public class Sax03 {
    public static void main(String[] args) {
//      1.创建对象
        SAXParserFactory newInstance = SAXParserFactory.newInstance();
        try {
//      2.获取解析器 
            SAXParser saxParser = newInstance.newSAXParser();
//      3.调用方法开始解析xml   
            File file = new File("girls.xml");
            MyHandler dh = new MyHandler();
            saxParser.parse(file, dh);
            List<Girl> girls=dh.getGirls();
//      4.输出集合
            System.out.println(girls);
        } catch (ParserConfigurationException | SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

最后的解析结果:
在这里插入图片描述

SAX解析 在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。if("作者".equals(currentTag)&& currentNumber==needNumber){//当前解析的是第几个。 阅读详情

相关推荐

JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

本文主要介绍XML文档作为存储和传输数据的三种解析方式,其各自主要的思想、实现方式、CURD实现,以及最后展示一个综合的实战例子加以巩固理解。

李春春的专栏 6175

SAX解析XML文件

SAX解析XML文件

m0_46619764的博客 1902

Java SAX 解析 XML

与 DOM 建立树形结构的方式不同,SAX 采用事件模型来解析 XML 文档,是解析 XML 文档的一种更快速、更轻量的方法。 利用 SAX 可以对 XML 文档进行有选择的解析和访问,而不必像 DOM 那样加载整个文档,因此它对内存的要求较低。 但 SAX 对 XML 文档的解析为一次性读取,不创建任何文档对象,很难同时访问文档中的多处数据。 在解析xml文件之前,我们要先了解xml文件的

itmyhome的专栏 2204

XML文档解析:SAX解析

一,SAX的概述              SAX(XML的简单API)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM ,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。 SAX的优点: 解析速度快 占用内存少 SAX的缺点: 无法知道当前...

SYJ_1835_LPM的博客 526

双摄像头的实时视频拼接及目标跟踪(一)

本章主要讲图像拼接算法的研究 先膜拜一下知乎大佬全面的叙述:https://www.zhihu.com/question/34535199/answer/135169187 本文图像拼接是基于opencv的图像拼接,流程分为以下几步 ...

Y.W.jian的博客 3万+

欧姆龙SYSMAC STUDIO如何与基恩士SR-1000进行EIP通信

简要介绍一下扫码枪和欧姆龙sysmac的配置

weixin_42031602的博客 4785

SAX解析XML 详解

SAX解析XML 详解

此生尽兴 7812

Marin说PCB之LPDDR5的布线注意事项--01

以上就是本期所有内容了,有些是通用的LPDDR5的设计准则,有的是针对单板的设计规则,严格意义说是没有哪一种规则是完全适用的LPDDR5的 通用规则的,不同的单板可能板厚,板材,层数,SOC以及DDR的型号都是不同的,一般的做法就是严格按照SOC手册上的LPDDR5的要求加上仿真同事给的建议修改优化就好了,我们下期文章不见不散。我们知道想要做好一个LPDDR颗粒,需要考虑的是因素有很多例如,电源完整性,信号完整性,层叠的设计,布局的摆放,布线的合理规划,去耦电容的摆放等等。

weixin_45223454的博客 3163

sax解析xml详解

sax与dom的区别 xml(或SGML)API主要有两种形式: 基于树的API,最常见的就是w3c的dom解析,java原生中也集成了这种解析方式,这种方式会将一个xml解析成为树的形式来处理并且是将整个xml放到内存中。 基于事件的API,也就是本次介绍的sax(Simple API for XML),它是直接通过处理不同的事件回调解析来处理xml,并不会建立维护一个内部的树,比如以下这种。...

qq_41063182的博客 4289

STM32H745xI双核芯片SMPS/LDO配置误区:从复位失败到精准排查的实战复盘

本文详细分析了STM32H745xI双核芯片在SMPS/LDO配置中的常见误区,特别是复位失败问题的排查过程。通过对比参考板与故障板的波形数据,揭示了电感选型不当导致的电源稳定性问题,并提供了硬件设计检查清单和调试技巧,帮助开发者避免类似陷阱。

weixin_42531588的博客 265

YOLOv11 改进 - 特征融合 | 小目标检测救星:DySample动态上采样减少特征丢失

本文介绍了超轻量且高效的动态上采样器DySample与YOLOv11的结合,以解决传统上采样器工作负载大、应用场景受限的问题。DySample从点采样角度构建上采样,绕过动态卷积,使用PyTorch标准内置函数实现,无需定制CUDA包,能大幅减少参数、FLOPs等资源消耗。我们将DySample代码集成进YOLOv11。实验脚本显示,结合DySample的YOLOv11在多个密集预测任务中或表现出色。

魔改工程师的博客 1416

Java使用SAX解析xml文件详解

xml文件 xml文件是一种可扩展语言,专门用来存储和传输数据,它与html文件类,但是不用于显示文件内容,只是用来存储和传输文件。它的格式非常简单。大家可以自行百度 SAX方法解析xml文件 SAX方法是一种流解析的方法,它是以顺序的方式从头至尾的解析xml文件,过一遍之后就结束了,所以应该注意在解析的过程中不断的存储数据。 我们要解析的xml文件内容为: <?xml version="1...

结庐境的博客 3262

芒果YOLOv7改进04:Loss篇:原创改进损失函数Repulsion:独家首发最新改进Repulsion Loss解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv7原创改进Repulsion|首发最新改进为解决密集人群检测中遮挡设计的损失函数

包括YOLOv5、YOLOv7、YOLOv8等模型改进 3252

Android XML解析之SAX解析 简单示例讲解

Android开发里,解析xml是很常见的场景了,其中SAX解析与PULL解析是两种比较常用的解析方式。还有DOM解析不太常用,因为它需一次性把xml文件加载到内存里,如果是大文件的话,很占内存,影响性能。 而SAX(Simple API for XML)解析是事件驱动的流式解析方式,并不是把xml全部加载到内存,而是一边读取一边解析,不可暂停或者倒退,直到结束。在解析过程中,会判断当前的节点及内...

本人整理的笔记与总结,涉及Android,Java,React,设计模式,算法等,愿对大家有帮助 767

51-14 Retentive Network,RetNet 多尺度保留机制序列建模论文精读

RetNet 提出了多尺度保留机制序列建模,该机制支持三种计算范式,即并行、循环和分块循环。RetNet有更好的全局注意力建模、高效的计算效率、对遮挡的鲁棒性、支持基于注意力的图像生成、与置信度相关的门控机制和多任务学习等特点,对不同视觉任务可以共享历史注意力记忆,可以同时进行分类、分割、检测等任务。RetNet在视觉领域应该有广阔的应用前景。

AIgraphX 1614

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JAVA SAX解析示例

JAVA 解析 XML 通常有两种方式:DOM 和SAX。

此生尽兴 1402

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

详解SAX解析XML

SAX,全称 Simple API for XML,是一种以事件驱动的 XMl API,即XML 简单应用程序接口。解析 XML 元素名称和内容的关键是当 SAX 解析 XML 时,把元素的名称和内容及时保存起来,同时 XML 中可能会有很多同名的元素,要把元素名称和内容对应起来。 与 DOM 不同,SAX 提供的访问模式是一种顺序模式,这是一种快速读写 XML 数据的方式。当使用 SAX 分析器对 XML 文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML

weixin_49543720的博客 901

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAX解析xml简单实例

SAX解析xml简单实例    SAX解析XML简单实例 2007-11-11 00:36      SAX主要是以串行和层次的方式进行解析,如下是一个很简单的解析例子: 1、选择一个要解析的xml文档      <book xmlns="http://www.oreilly.com/javaxml2" xmlns:ora="http://w

chen_xiaowei123的专栏 530

SAX方式解析XML详解

一、SAX解析原理简介 原理:SAX方式采用事件处理的方式解析XML文件,涉及到两个部分:解析器和事件处理器。SAX解析器从XML文件第一行开始往下读,读取一行处理一行(不能往回读取)。解析器每读取一行将会触发特定的事件,然后调用事件处理器中处理该事件的方法。 解析器:可以使用Jaxp的API创建,创建SAX解析器后就可以指定它解析某个XML文件。 事件处理器:由程序员编写,程序员通过事件处

爱生活爱技术 1538
上一篇: 工具类--正整数校验
下一篇: 工具软件--Eclipse Memory Analyzer tool
fly__ing
博客等级 码龄9年 2392粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值