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解析相关推荐

  1. 安卓小菜鸟重拾Java系列002.Java转义字符与与sax解析xml

    已经好久没有更新博客了,炎热的夏天正如我的心情一样枯燥乏味,今年是互联的寒冬,作为一个菜鸟已经深深的感觉到了,因为自己失业了.从去年的年末的一些听闻,自己竟没有准备好迎接失业,以至于一年了,只比以前强 ...

  2. 对xml文件的sax解析(增删改查)之一

    crud(增删改查): c:creat r:retrieve u:update d:delete 以下笔记来自于韩顺平老师的讲解. 现在是用java来操作. 第一步:新建java工程.file-new ...

  3. DBLP数据集XML使用python SAX解析 作者名字显示错误问题

    问题描述 最近在做实验时处理DBLP XML数据集时,作者名字部分显示不全,比如一些带有特殊符号的作者Michael H. Böhlen解析完后就会变成Michael H. Böhlen.这样会导致一 ...

  4. java xml 查询_Java DOM解析器 - 查询XML文档

    演示示例 这是需要我们查询的输入XML文件: Ferarri 101 Ferarri 201 Ferarri 301 Lamborgini 001 Lamborgini 002 Lamborgini ...

  5. android用sax解析xml,Android:采用SAX解析XML实例

    接着之前的部分现在要编写代码解析如下的person.xml文件 liming 30 xiaohong 25 程序结构图如下 person类用于保存信息 SAXPersonService负责解析 pac ...

  6. JavaWeb-05 XML基础(Dom解析和Sax解析)

    JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据 ...

  7. XML解析(一),SAX解析XML

    转载自  XML解析(一),SAX解析XML 一.概述  SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM ...

  8. 详解SAX解析XML

    SAX,全称 Simple API for XML,是一种以事件驱动的 XMl API,即XML 简单应用程序接口.解析 XML 元素名称和内容的关键是当 SAX 解析 XML 时,把元素的名称和内容 ...

  9. 第二十四天学Python:文件(3)XML格式文件的建立,用SAX解析

    尽管北方的春天比南方要晚很多,尽管这里经历两次气温骤降,尽管过程起伏跌宕,但是春天的脚步不会有丝毫地停顿,阵阵花香终会飘入房中. 该来的总会来的. /doge 没啥,就是感慨一下苦等许久的春天终于来了 ...

最新文章

  1. win7怎么去除快捷方式的小箭头
  2. WM有约II(二):持续改进
  3. cacti及其相关插件的安装
  4. 在列表前方插入一个数据_通俗易懂的Redis数据结构基础教程
  5. java inireader_java读取配置文件 Java中如何设置读取ini配置文件?
  6. GARFIELD@03-26-2005
  7. 02_感知机_统计学习方法
  8. c#操作json 使用JavaScriptSerializer
  9. python模块-time,datatime
  10. fatal: unable to access ‘https://github.com/abseil/abseil-cpp.git/‘: Failed connect to github.com:44
  11. python华为认证_HCIA-AI华为认证AI工程师在线课程题目及参考答案
  12. 创客匠人直播升级服务,打造主流直播课堂​
  13. ie浏览器使用video标签无法播放mp4文件 完美解决方案
  14. 写在给自己入个耳机之前
  15. nginx的日志格式记录真实客户端IP
  16. Linux命令之ln -s命令(软链接)
  17. AMD GPU虚拟化
  18. web前端开发和岗位职责
  19. 倍福--步进电机的控制
  20. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第三周题解(个人向仅供参考)

热门文章

  1. python制作小提琴图
  2. javascript中的三角函数和反三角函数
  3. const指针、数组指针、指针数组理解
  4. 【LB】稀疏矩阵的快速转置原理及其算法
  5. DPDK:UDP 协议栈的实现
  6. DSG-RealSync Oracle数据库同步复制及容灾技术简述
  7. Android 和 iOS 开发的寒冬了?
  8. SubString 函数总结
  9. 计算机通过华为手机上网,华为手机网络怎么共享给电脑(必知网络共享3步曲)...
  10. SSS1630规格书|SSS1630中文设计方案|USB音频解码方案