java拾遗2----XML解析(二) SAX解析
XML解析之SAX解析:
SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得。
注意SAXParser的parse()方法:
parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要传递一个DefaultHandler的对象。
查看API帮助手册可知,SAX解析是事件驱动的,DefaultHandler是SAX2 事件处理程序的默认基类,在 org.xml.sax.helpers 软件包中,由它来实现相关事件的回调,并提供所有回调方法默认的空实现。
DefaultHandler的常用回调方法:
void startDocument():接收文档开始的通知。
void startElement(String uri, String localName, String qName, Attributes attributes): 接收元素开始的通知。
void characters(char[] ch, int start, int length): 接收元素中字符数据的通知。
void endElement(String uri, String localName, String qName):接收元素结束的通知。
void endDocument(): 接收文档结束的通知。
为什么说SAX是推模式解析?
SAX 解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,由解析器自动调用相应事件方法,而不是由我们自己去调用。
使用SAX解析XML,观察各种事件回调:
有如下要解析的xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student id="003">
<name>xiaoqiao</name>
</student>
</students>
解析代码:
public class SaxXmlParser {
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse("students_bak.xml", new DefaultHandler(){
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("read characters:"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
System.out.println("end document...");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("end element:<"+qName+">");
}
@Override
public void startDocument() throws SAXException {
System.out.println("start document...");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("start element:<"+qName+">");
if(qName.equals("student")){
System.out.println("id="+attributes.getValue("id"));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面代码在parse()方法中,第二个参数定义了一个继承自DefaultHandler的匿名内部类对象,重写了5个主要的事件回调方法,用以观察事件的触发过程。
在startElement()方法中qName存放的是节点名,attributes存放的是该节点的属性,endElement()方法同样。
运行结果:
start document...
start element:<students>
read characters:
start element:<student>
id=003
read characters:
start element:<name>
read characters:xiaoqiao
end element:<name>
read characters:
end element:<student>
read characters:
end element:<students>
end document...
首先回调的是startDocument()方法;
然后碰到<students>节点,回调startElement()方法;
<students>后面有回车,所以会触发characters()方法,输出当前读到的字符;
然后碰到<student>节点,回调startElement()方法,输出id属性值;
后面也有回车,所以会触发characters()方法,输出当前读到的字符;
然后碰到了<name>节点,回调startElement()方法;
后面是xiaoqiao,回调characters()方法;
然后到</name>,回调endElement()方法;
碰到回车,回调characters()方法;
到</student>,回调endElement()方法;
碰到回车,回调characters()方法;
到</students>,回调endElement()方法;
文档结束,回调endDocument()方法,解析工作结束。
如果有需要对文档进行别的处理操作,如查找某个节点等,可以重写响应的事件回调方法,添加上需要的逻辑的实现代码即可。
java拾遗2----XML解析(二) SAX解析的更多相关文章
- XML解析(二) SAX解析
XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...
- Java SE之XML<二>XML DOM与SAX解析
[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...
- Java xml 操作(Dom4J修改xml + xPath技术 + SAX解析 + XML约束)
1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...
- java解析XML之DOM解析和SAX解析(包含CDATA的问题)
Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- 经典面试题:一张表区别DOM解析和SAX解析XML
============DOM解析 vs ...
- XML 解析---dom解析和sax解析
眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...
- XML的概述,.Dom4解析和SAX解析
1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...
- XML.03-DOM和SAX解析
body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...
随机推荐
- RESTful接口签名认证实现机制
RESTful接口 互联网发展至今,催生出了很多丰富多彩的应用,极大地调动了人们对这些应用的使用热情.但同时也为互联网应用带来了严峻的考验.具体体现在以下几个方面: 1. 部署方式的改变:当用 ...
- 用PHP上传文件时$_FILES中error返回值详解
用PHP上传文件时,我们会用程序去监听浏览器发送过来的文件信息,首先会通 过$_FILES[fieldName]['error']的不同数值来判断此欲上传的文件状态是否正常.$_FILES[field ...
- Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案
Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案 在win7 32位旗舰版下,启动1.0.8版本nginx,显示如下错误: [plain] 2012/04/0 ...
- [React] Use react-rewards to add microinteractions to React app to reward users for some actions
It's important that our users enjoy using our application or website. One way we can make it happen ...
- AndroidStudio短信验证功能收不到验证码
http://mob.com/第三方接口获取地址: 登陆过后点我的后台即可上传,管理应用.需注意的是,即使验证不通过,只要整合了短信验证的Jar包,每天都有20条免费验证短信.现在的mob.com只支 ...
- 底部菜单实现(Dialog方案)
项目中经常会要实现在屏幕底部弹出一个窗口,比如一个分享窗口: 下面详解实现步骤: 1.定义布局 <?xml version="1.0" encoding="utf- ...
- Android 软键盘的监听(监听高度,是否显示)
Android官方本身没有提供一共好的方法来对软键盘进行监听,但我们实际应用时.非常多地方都须要针对软键盘来对UI进行一些优化. 下面是整理出来的一个不错的方法.大家能够使用. public clas ...
- 【OpenGL 学习笔记01】HelloWorld演示样例
<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比較踏实,哈哈. 我的主题是,好记性不如烂笔头. ========== ...
- js原生方式实现bind方法
1.思路 (1)因为bind方法不会立即执行函数,需要返回一个待执行的函数(这里用到闭包,可以返回一个函数)return function(){} (2)作用域绑定,这里可以使用apply或者call ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现(续)
4.4 权限属性RequireAuthorizationAttribute [csharp] view plaincopy "font-size:14px;">/// / ...