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和 ...
随机推荐
- web-inf文件夹的使用
web-inf文件夹在正常情况下系统是不允许外界直接访问的,访问里面的文件就会出现404错误,但是系统可以自身进行访问,所有要使系统去访问的话就需要使用拦截控制器去接受外界命令,由控制器来转发访问请求 ...
- Intellij Idea如何不显示.idea target文件夹
Intellij Idea如何不显示.idea target文件夹 学习了:https://jingyan.baidu.com/article/ceb9fb108e26958cac2ba047.htm ...
- Angular 学习笔记——自定义指令之间的交互
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- php权威编程有趣部分
1.isset empty如果遇到null,isset判断为false;empty 判断为trueisset(var1, var2,...) 可以判断多个变量 2.unsetunset可以取消之前定义 ...
- 【Xcode学C-3】if等流程控制、函数的介绍说明标记分组、#include以及LLVM
一.流程控制:if.while和for循环 (1)if括号中面常常遇到推断是否相等的情况,并且新手常常会把==写成=.所以建议的习惯是把常量放在前面.如a==10.写成10==a,这样就不易犯错. ( ...
- Calculation 2-欧拉函数的运用
Calculation 2 Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit ...
- ORACLE截取字符串
每行显示固定字符串,截取字符串 方法一:在循环里面输出 DECLARE l_char VARCHAR2 (3000 ) := 'ORACLEEB电子商务套件SSYSTEMg ...
- 操作LOG文件-删除log目录下,所有的空文件-删除5天前的文件
# 1.logs目录下,有一部分文件是空的# 1.删除log目录下,所有的空文件# 2.删除5天前的文件 # 需求分析:# 1.os.walk()获取到所在以.log结尾的文件# 2.判断文件的大小, ...
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- ros之串口通信---imu
1.sudo apt-get install ros-kinetic-rosserial 或者sudo git clonegit://github.com/wjwwood/serial.git (开 ...