Java:XML之JavaSE SAX解析
XML之JavaSE SAX解析
概述
SAX(Simple API For XML)是一个公共的基于事件的XML文档解析标准,能够通过一个简单的、快速的方法来对XML文档进行处理,和DOM相比它所占用的系统资源更少。
SAX既是一个接口,也是一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口,对文档进行顺序扫描,当扫描到文档(document)开始、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
SAX的优点:
解析速度快
占用内存少SAX的缺点:
无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码
只能读取XML,无法修改XML
无法随机访问某个标签(节点)
SAX解析适用场合对于CPU资源宝贵的设备,如Android等移动设备
对于只需从xml读取信息而无需修改xml
1、获取到文档对象来操作XML文档
public static void main(String[] args){//创建SAX解析工厂:利用抽象类SAXParserFactory中的静态方法进行实例化SAXParserFactory factory = SAXParserFactory.newInstance();//同过工厂创建解析器:调用抽象类SAXParserFactory的实例化对象的方法对抽象类SAXParser进行实例化SAXParser parser = factory.newSAXParser();//通过解析器解析XML文件,自动逐行解析//uri为XML文档路径 String,dh为DefaultHandler实例化对象//需根据续期对DefaultHandler类中的方法重写。parser.parse(uri, dh); //Document创建完成,下文详细讲解
}
DefaultHandler类中主要的方法有,其中主要需要改写的方法有startElement,characters,endElement,通过对这3个方法的改写,即可完成XML文件的定向解析。
public void startDocument() throws SAXException {}public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//元素开始标签,可根据需求重写方法}public void characters(char[] ch, int start, int length) throws SAXException {//文本内容,可根据需求重写方法}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {//元素结束标签,可根据需求重写方法}@Overridepublic void endDocument() throws SAXException {}
2、打印XML文件中文本内容
public class Demo{public Static void main(String[] args){//创建SAX解析工厂:利用抽象类SAXParserFactory中的静态方法进行实例化SAXParserFactory factory = SAXParserFactory.newInstance();//同过工厂创建解析器:调用抽象类SAXParserFactory的实例化对象的方法对抽象类SAXParser进行实例化SAXParser parser = factory.newSAXParser();//通过解析器解析XML文件,自动逐行解析//uri为XML文档路径 String,dh为DefaultHandler实例化对象//需根据续期对DefaultHandler类中的方法重写。//MyHandler类为创建的新类parser.parse(uri, new MyHandler());}
}//创建一个类,继承DefaultHandler类并重写类中的方法
class MyHandler extends DefaultHandler{@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//打印元素开始标签System.out.print("<" + qName + ">");}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {//打印文本内容String string = new String(ch,start,length);System.out.print(string);}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {//打印元素结束标签System.out.print("</" + qName + ">");}
}
3.通过输入元素名和元素索引得到元素内容
public class Demo{public Static void main(String[] args){//创建SAX解析工厂:利用抽象类SAXParserFactory中的静态方法进行实例化SAXParserFactory factory = SAXParserFactory.newInstance();//同过工厂创建解析器:调用抽象类SAXParserFactory的实例化对象的方法对抽象类SAXParser进行实例化SAXParser parser = factory.newSAXParser();//通过解析器解析XML文件,自动逐行解析//uri为XML文档路径 String,dh为DefaultHandler实例化对象//需根据续期对DefaultHandler类中的方法重写。//MyHandler类为创建的新类parser.parse(uri, new MyHandler(tagName,index));}
}
class MyHandler extends DefaultHandler{//定义内部索引i用于查找指定索引private int i;//定义索引index,需由外界传值private int index;//定义标志,在找到指定标签时对应文本内容使用private boolean flag;//标签名private String tagName;public MyHandler() {}//通过构造方法传递需要查找的标签内容和索引public MyHandler(String tagName, int index) {this.index = index;this.tagName = tagName;}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//对标签名配对,找到时将标志flag的值改为trueif(tagName!=null)if(tagName.equals(qName)) {flag = true;}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {//标志flag与索引同时满足时,打印文本内容字符串,内部索引与输入索引值不相等时,跳过if(flag && i==index) {String string = new String(ch,start,length);System.out.println(string);}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {//元素结束标签,将flag值改为false,内部索引加1if(tagName!=null)if(tagName.equals(qName)) {flag = false;i++;}}}
Java:XML之JavaSE SAX解析相关推荐
- 安卓小菜鸟重拾Java系列002.Java转义字符与与sax解析xml
已经好久没有更新博客了,炎热的夏天正如我的心情一样枯燥乏味,今年是互联的寒冬,作为一个菜鸟已经深深的感觉到了,因为自己失业了.从去年的年末的一些听闻,自己竟没有准备好迎接失业,以至于一年了,只比以前强 ...
- 对xml文件的sax解析(增删改查)之一
crud(增删改查): c:creat r:retrieve u:update d:delete 以下笔记来自于韩顺平老师的讲解. 现在是用java来操作. 第一步:新建java工程.file-new ...
- DBLP数据集XML使用python SAX解析 作者名字显示错误问题
问题描述 最近在做实验时处理DBLP XML数据集时,作者名字部分显示不全,比如一些带有特殊符号的作者Michael H. Böhlen解析完后就会变成Michael H. Böhlen.这样会导致一 ...
- java xml 查询_Java DOM解析器 - 查询XML文档
演示示例 这是需要我们查询的输入XML文件: Ferarri 101 Ferarri 201 Ferarri 301 Lamborgini 001 Lamborgini 002 Lamborgini ...
- android用sax解析xml,Android:采用SAX解析XML实例
接着之前的部分现在要编写代码解析如下的person.xml文件 liming 30 xiaohong 25 程序结构图如下 person类用于保存信息 SAXPersonService负责解析 pac ...
- JavaWeb-05 XML基础(Dom解析和Sax解析)
JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据 ...
- XML解析(一),SAX解析XML
转载自 XML解析(一),SAX解析XML 一.概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...
- 详解SAX解析XML
SAX,全称 Simple API for XML,是一种以事件驱动的 XMl API,即XML 简单应用程序接口.解析 XML 元素名称和内容的关键是当 SAX 解析 XML 时,把元素的名称和内容 ...
- 第二十四天学Python:文件(3)XML格式文件的建立,用SAX解析
尽管北方的春天比南方要晚很多,尽管这里经历两次气温骤降,尽管过程起伏跌宕,但是春天的脚步不会有丝毫地停顿,阵阵花香终会飘入房中. 该来的总会来的. /doge 没啥,就是感慨一下苦等许久的春天终于来了 ...
最新文章
- win7怎么去除快捷方式的小箭头
- WM有约II(二):持续改进
- cacti及其相关插件的安装
- 在列表前方插入一个数据_通俗易懂的Redis数据结构基础教程
- java inireader_java读取配置文件 Java中如何设置读取ini配置文件?
- GARFIELD@03-26-2005
- 02_感知机_统计学习方法
- c#操作json 使用JavaScriptSerializer
- python模块-time,datatime
- fatal: unable to access ‘https://github.com/abseil/abseil-cpp.git/‘: Failed connect to github.com:44
- python华为认证_HCIA-AI华为认证AI工程师在线课程题目及参考答案
- 创客匠人直播升级服务,打造主流直播课堂​
- ie浏览器使用video标签无法播放mp4文件 完美解决方案
- 写在给自己入个耳机之前
- nginx的日志格式记录真实客户端IP
- Linux命令之ln -s命令(软链接)
- AMD GPU虚拟化
- web前端开发和岗位职责
- 倍福--步进电机的控制
- 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第三周题解(个人向仅供参考)