xml文件的sax解析

Java——SAX解析XML文件 SAX适用于只读取XML文件内容的情况,因为SAX是一种边读边解析的模式,所以不需要直接将XML文件直接塞入内存,读取速度也更快,但是只能读。 SAX解析主要有两个部分:①解析器②事件处理器 过程:// 创建解析器工厂、获取解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParse 阅读详情
       sax解析xml,采用事件处理方法,它的解析不需要完全加载完文件,可以避免了当xml文件过大时导致内存溢出的情况。sax解析主要包含两部分:解析器与事件处理器。
       java api中已经提供了 创建sax解析器的方式。解析器只要解析到xml文档中的一个部分,就会调用事件处理器的某个方法。如下面的person.xml方件,当读到xml的开始,会触发事件处理器的startDocument()方法,当读到<persons>标签时,又会触发事件处理器的startElement()方法。 事件处理器是由我们来完成的,都过不同的事件,执行不同的方法,就可以完成对xml文件的解析。
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="328">
		<name>zhangsan</name>
		<age>23</age>
	</person>
	<person id="303">
		<name>lisi</name>
		<age>22</age>
	</person>
</persons>

如何获取解析器?
     1、得到解析工厂。
     2、得到解析器。
     3、解析xml文件

如何获取事件处理器?
     方法1、实现ContentHandler接口,这个方法要实现很多事件处理方法,不是很方便。
     方法2、继承DefaultHandler类,查看源码可以看到, DefaultHandler实现了ContentHandler接口,只是对其方法空实现,所以我们只需要重写我们要处理的事件。
     
     常用事件:
     1、startDocument() 读到文档开始时触发事件。
     2、endDocument() 读到文档结束时触发事件。
     3、startElement() 读到标签开始时触发事件。
     4、endElement() 读到标签结束时触发事件。
     5、characters() 读到文档字符数据时触发事件。哪怕是空白区域,也会触发这个方法。

下面看一个例子,将上述person.xml保存项目src目录下,并读取后将内容封装成Person对象。
Person类:
public class Person {
	private int id;
	private String name;
	private int age;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Person() {
		super();
	}
}

sax解析:
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
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 SaxTest {

	public static void main(String[] args) {
		try {
			//解析器的获取
			//1、获取sax解析工厂
			SAXParserFactory  sf = SAXParserFactory.newInstance();
			//2、获取解析器
			SAXParser sp = sf.newSAXParser();
			
			//创建xml文件的输入流
			InputStream inStream = SaxTest.class.getClassLoader()
					.getResourceAsStream("person.xml");
			//3、解析xml文件,将事件处理器传入。
			sp.parse(inStream, new PersonHandler());
		} catch (ParserConfigurationException | SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

//事件处理器。
class PersonHandler extends DefaultHandler {
	private String currentTag;
	private List<Person> persons = null;
	private Person person = null;
	
	//读到文档开始时触发的事件
	public void startDocument() throws SAXException {
		persons = new ArrayList<Person>();
	}

	//读到文档开始标签时触发的事件
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		currentTag = qName;
		System.out.println(qName);
		if ("person".equals(qName)) {
			person = new Person();
			String id = attributes.getValue("id");
			person.setId(Integer.parseInt(id));
		}
	}
	//读到字符数据时触发的事件。
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// if(currentTag.equals("name")) { 容易抛空指针异常
		if ("name".equals(currentTag)) {
			person.setName(new String(ch, start, length));
		}
		if ("age".equals(currentTag)) {
			String age = new String(ch, start, length);
			person.setAge(Integer.parseInt(age));
		}
	}
	//读到结束标签时触发的事件。
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println(qName);
		if ("person".equals(qName)) {
			persons.add(person);
			person = null;
		}
		currentTag = null;
	}

	public void endDocument() throws SAXException {
		for (Person p : persons) {
			System.out.println(p);
		}
	}
}

此处再介绍一下XMLReader的用法:
获取解释器之后,我们也可以获取它的XMLReader对象,该对象
  1. 增加了查询和设置功能和属性的标准方法;
  2. 增加了对名称空间的支持,这是许多高层的 XML 标准所必需的。 
具体方法如下。
			//解析器的获取
			//1、获取sax解析工厂
			SAXParserFactory  sf = SAXParserFactory.newInstance();
			//2、获取解析器
			SAXParser sp = sf.newSAXParser();
			//得到读取器
			XMLReader reader = sp.getXMLReader();
			//设置读取器的事件处理器对象。
			reader.setContentHandler(new PersonHandler());
			//开始解析
			reader.parse("src/person.xml");




SAX解析超大XML文件的高效实现与示例 XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据。它的可扩展性允许用户定义自己的标签和结构,使得XML成为在不同的应用程序之间交换数据的理想选择。随着数据交换需求的增长,有效地解析XML文件变得至关重要。一个解析器是一个程序或库,它可以读取XML文件,并将这些文件转换为计算机程序能够处理的某种形式,如文档对象模型(DOM)或简单应用程序接口(SAX)。 阅读详情

相关推荐

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

SAX解析XML文件

SAX解析XML文件

m0_46619764的博客 1901

FineReport SQL查询分页

打开模板>模板web属性>分页预览设置,选择为该模板单独设置,将默认的工具栏按钮全部清除掉,然后依次添加两个自定义按钮,一个邮件按钮,两个自定义按钮,一个Word格式,一个PDF按钮。如下所示:注:使用具体格式按钮,如邮件、Word格式、PDF按钮是为了JS直接使用控件名称获取空间方便修改其内容;

lep的博客 2428

XML解析之SAX方式

XML解析之SAX方式解析xml文件 SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。 SAX解析可分四个步骤进行: 1、得到xml文

Fisher 2891

ArcGIS新手必看:HWSD2土壤数据从下载到批量提取TIFF的完整流程

本文详细介绍了ArcGIS中HWSD2土壤数据的完整处理流程,从数据下载、预处理到批量提取TIFF文件。涵盖栅格属性表构建、属性数据连接及性能优化等关键步骤,帮助新手高效掌握HWSD2数据提取技术,提升地理信息数据处理效率。

ll5678的博客 1036

从Blender舞步到夜空画卷:基于Pix飞控的无人机编队灯光秀全链路开发实践

本文详细介绍了基于Pixhawk飞控的无人机编队灯光秀全链路开发实践。从Blender三维动画设计、QGroundControl地面站二次开发与MAVLink通信桥接,到PX4飞控的OFFBOARD模式路径控制与LED灯光驱动实现,最后通过Gazebo仿真验证并完成真机组装与首飞。文章为无人机爱好者提供了一套完整的、从创意设计到夜空执行的开源解决方案,重点阐述了多机同步与灯光控制的核心技术挑战与应对策略。

zeta9的博客 585

XML解析(一),SAX解析XML

一、概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOC解析,PULL解析(Android特有),SAX与DOC不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点,对于Android等CPU资源宝贵的移动平台来说是一个巨大的优势。 SAX的优点:解析速

宿罪的博客 3万+

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1670

SAX方式解析XML详解

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

爱生活爱技术 1538

3、保险行业商业智能解决方案的理解与实施

本文详细探讨了商业智能(BI)在保险行业的应用与实施策略,涵盖了从BI环境开发的关键步骤、自下而上与自上而下的数据仓库开发方法,到决策支持工具的选择与使用。文章还分析了BI系统与互联网、内联网和外联网的结合方式,并讨论了购买与自建方案的优劣比较,最后总结了商业智能成功的关键因素及其对保险行业带来的商业价值。通过实际案例与未来趋势展望,展示了商业智能如何推动保险企业的数字化转型和竞争力提升。

moon9的博客 97

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

黑猫带你学eMMC协议第7篇:全网最全emmc写保护详解(write protect) 黑猫带你学eMMC协议第8篇:emmc可靠写详解(Write Reliability) 黑猫带你学eMMC协议第9篇:emmc的分区配置(partitioning) 黑猫带你学eMMC协议第10篇:eMMC命令队列详解(CMDQ) 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim…) 黑猫带你学eMMC协议第12篇:

黑猫奥利奥的博客 2万+

​SAX方式解析XML文档​

SAX方式解析XML文档 一、SAX (Simple API for XML)   SAX解析方式是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。     优点: 无需将整个文档加载到内存中, 所以内存消耗少的 ,适合解析特别大的 XML文件。 二、步骤 创建解析工厂:通过SAXParaserFactory.newInstanc...

qq_59212717的博客 1222

如何使用Github创建一个完全免费的个人网站

摘要: 本文详细介绍如何利用Github Pages免费搭建个人静态网站,适合零基础用户。首先需注册Github账号并创建特定命名的仓库(格式:用户名.github.io),然后通过网页或命令行创建index.html文件作为网站首页。完成后可通过"仓库设置- Pages"获取网站链接。文章还包含GitHub Desktop的安装使用、代码提交指南及常见问题自检方法,并说明即使Github被墙也可迁移至国内平台(如码云)。整个过程无需编程基础,仅需15分钟即可完成基础网站搭建。

安德洛夫 1514

Android中使用SAX方式解析XML文件

在Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的pull解析器。在本篇文章中主要采用例子说明使用SAX方式解析XML文件。          SAX是一

Android-Idea 5541

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【JavaWeb】xml文件_SAX解析(xml文件的解析)

SAX解析 1.编程理念:基于事件编程的原理 2.(1)SAX解析的特点:读取一点,处理一点,解析一点    (2)DOM解析的特点:将整个xml文件加载完毕之后,才开始进行解析(一次性解析)     DOM解析的弊端:使用DOM解析的xml文件内容不能太大,否则会造成内存溢出 3.SAX解析的优点:占用内存小,从占用内从角度考虑SAX解析优于DOM解析 4.SAX解析图解:

午后红茶 1157

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java xml文件解析 sax 解析笔记

一般为以下步骤: 1、得到xml文件对应的资源,可以是xml的输入流,文件和uri 2、得到SAX解析工厂(SAXParserFactory) 3、由解析工厂生产一个SAX解析器(SAXParser) 4、传入输入流和handler给解析器,调用parse()解析 //1.创建解析工厂 SAXParserFactoryfactory=SAXParserF...

Matthew的博客 395

java使用SAX解析器解析XML文件

SAX,也称为Simple API for XML,是jdk自带的 用于解析 XML 文档 API。它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小,所以 SAX 具有高效的内存管理。 三、XmlRow类 四、SAXHandler类 五、测试 输出: 参考:Parsing an XML File Using SAX ParserParsing an XML File Using StAXexcel-xml-

西凉的悲伤博客 4283

XML学习之SAX解析XML文件

XML学习之SAX解析XML文件 一、SAX解析方式概述 1、Sax解析允许每读取一行文本就解析一行文本的方式对XML文件进行解析。不必等到读取完文件后才开始解析。提高了解析速度。 2、sax采用事件处理方式解析XML文件,利用SAX解析XML文档,涉及两个问他:解析器和事件处理器。   (1)、解析器:解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个X

yanyu110991的专栏 681

java采用SAX解析xml文件

问题原因 1.最近在解析xml 文件时,之前用的DOM比较方便简单,但是现在发现xml文件高达6G,内存已经撑不住了,因为DOM解析是将xml数据全部加入到内存中形成完整的dom树,所以就改了流式解析。 SAX解析 优点: 基于事假驱动,顺序读写,速度快,解析时,占用内存小。 缺点:不能任意读取节点,灵活性差。 package com.yicong.boke.test.crawler.saxxml; import java.io.File; import java.util.ArrayList; impo

weixin_43700510的博客 296

通过SAX方法解析xml文件

一、SAX与DOM的区别 DOM:先将XML文件的内容全部读取 SAX:通过Handler类对文件的节点由外带内逐个解析,其中startElement表示解析开始便签,endElement表示解析结束标签。 二、SAX解析xml文件的步骤: 1. 通过SAXParserFactory的静态newInstance()方法获取SAXParserFactory实例factory SAXPars

Stephen_90的博客 2611

使用SAX解析XML文件

SAX(Simple API for XML),是指一种接口,或者一个软件包。   DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的,此结构占用的内存较多。 SAX:事件驱动型的XML解析方式。顺序读取XML文

zuolongsnail的专栏 2万+

SAX方式解析XML文件

SAX,全称Simple API for XML,是一种以事件驱动的 XML API,SAX 与 DOM 不同的是它边扫描边解析, 自顶向下依次解析, 由于边扫描边解析, 所以它解析 XML 具有速度快, 占用内存少的优点。

m0_46294535的博客 435
上一篇: java实现多线程下载技术
下一篇: xml文件的dom4j解析
Sweeter
博客等级 码龄14年 81粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值