`

Java解析XML数据(二)——SAX解析

阅读更多

上一节写到了如何使用DOM解析XML文档,而且掌握DOM解析的关键就在于要理解树模型。可以发现,DOM解析的步骤非常繁琐,代码量繁多,但是只要明白了树结构模型,理解起来也不是很难。这一篇文章将讲解一种步骤较为简单,代码量简化了很多,但是理解难度有点大的解析方式——SAX解析。

 

首先,我们来了解下什么叫SAX。

SAX,即Simple API For XML。非W3C官方所提供的标准,是“民间”的事实标准。SAX在概念上与DOM完全不同。SAX是非文档驱动,而是事件驱动的。

 

所谓事件驱动,就是一种基于回调机制的程序运行方法。SAX解析器装载XML文件时,它遍历XML文档并在其主机应用程序中产生事件(经由回调函数、指派函数或者任何可调用平台完成这一功能)表示这一过程。

 

我们知道DOM解析的核心是将XML文档构建成一棵树的模型,而SAX解析方式的核心是要创建一个XML解析器类,让其继承于DefaultHandler类,并且重写DefaultHandler类的五个回调方法。那么我们就从五个回调方法讲起。

 

一、XML解析器DefaultHandler类的五个回调方法

(一)startDocument

该方法表示XML文档的开始,当被解析的XML文档调入解析器开始解析时调用该方法,该方法抛出一个SAXException异常。 

(二)endDocument

 该方法表示XML文档的结束,当被解析的XML文档解析完毕时调用该方法,该方法抛出一个SAXException异常。 

(三)startElement 

该方法表示元素开始,当一对标记中的起始标记处理后,解析器激发此事件,这里的元素也包括标记名和其属性。该方法接收4个参数(String uri, String localName, String qName, Attributes attributes),最后一个参数表示可以通过这个元素获得该元素的某一属性值,所以通常在这个方法里获得元素的属性值。同样,该方法抛出一个SAXException异常。 

(四)endElement 

该方法表示元素开始,当一对标记中的起始标记处理后,解析器激发此事件,这里的元素也包括标记名和其属性。该方法接收3个参数(String uri, String localName, String qName),往往通过这个方法来获取对应的元素(包括文本)名称。同样,该方法抛出一个SAXException异常。 

(五)Characters 

包含字符串数据,类似于DOM的一个Text节点。该方法接收3个参数(char[] ch, int start, int length),当碰到文本的时候会触发该方法,所以可以在这个方法里保存读取到的文本信息(通常使用一个成员变量保存),然后通过保存的文本信息传递到endElement方法中读取。同样,该方法抛出一个SAXException异常。

 

由此我们可以知道五个回调方法中最为核心的是后面三个。我们可以用一副图来理解一下SAX解析。

 

 

接下里,我们通过一个实际的例子来掌握下SAX解析。

 

二、SAX解析实例。

(一)先用Eclipse创建一个项目,也可以在之前DOM解析的项目下新建一个sax解析的包。

这里我们同样使用之前在DOM解析时用到的XML文件,即book.xml。(不知道的小伙伴可以在上一篇DOM解析中找到),同样需要创建一个与该XML文档对应的模型类——Book.java。内容与上一届DOM解析中的一模一样,这里不重复粘贴代码了。

 

(二)创建一个解析器类。具体要求如下:

1、让其继承于DefaultHandler类,并重写刚刚提到的五个回调方法;

2、创建一个Book对象保存读取到的元素结点,创建一个String变量,用来保存在Characters方法中读取到的文档内容;

3、创建一个List列表用来保存解析的Book对象,为其添加一个getter方法。

具体可参考以下代码:

public class DemoHandler extends DefaultHandler {

	private ArrayList<Book> list = new ArrayList<>();

	public ArrayList<Book> getList() {
		return list;
	}

	private Book book;

	private String text;

	@Override
	public void startDocument() throws SAXException {
		// 当解析文档开始后执行
		super.startDocument();
		System.out.println("startDocument");
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// 当碰到一个元素的时候执行
		super.startElement(uri, localName, qName, attributes);
		// 如果是book标签开头
		if (qName.equals("book")) {
			// 获得book的属性
			book = new Book();
			String isbn = attributes.getValue("isbn");
			book.setIsbn(isbn);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// 当碰到的元素标记结束后执行
		super.endElement(uri, localName, qName);
		// 结束了book内容,说明该对象的内容读完了
		if (qName.equals("book")) {
			// 将该对象放到list中去
			list.add(book);
		} else if (qName.equals("title")) {
			book.setTitle(text);
		} else if (qName.equals("author")) {
			book.setAuthor(text);
		} else if (qName.equals("price")) {
			int price = Integer.parseInt(text);
			book.setPrice(price);
		}
	}

	@Override
	public void endDocument() throws SAXException {
		// 当要解析的文档结束后执行
		super.endDocument();
		System.out.println("endDocument");
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// 当碰到文本信息(非元素标签)的时候执行
		super.characters(ch, start, length);
		this.text = new String(ch, start, length);
	}

}

 

(三)创建一个包含主方法的主类来测试这个SAX解析器,具体可参考以下代码:

public class ParseApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// 创建SAX解析器对象
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			File f = new File("book.xml");
			// 解析处理器
			DemoHandler handler = new DemoHandler();
			// 调用解析方法   f  ----->   handler
			parser.parse(f, handler);
			// 得到解析结果
			ArrayList<Book> list = handler.getList();
			// 打印解析到的数据
			for (Book book : list) {
				System.out.println(book);
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

(四)运行结果截图


 

 

之后会更新一篇利用第三方包SimpleXML的方式去解析XML文档。

 

谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~微笑微笑微笑

 

  • 大小: 23.8 KB
  • 大小: 19.4 KB
分享到:
评论

相关推荐

    XML——sax解析 极速入门易懂示例

    学习xml——sax解析的项目小示例 非常简单易懂 而且包括多种sax解析的方法 如xmlReader,saxBuilder工厂,还包括一个dom解析的示例(DocumentBuilder工厂)

    使用DOM解析XML和使用SAX解析XML

    java学习笔记——使用DOM解析XML和使用SAX解析XML

    Java Web 开发实战经典(基础篇)

    010303_XML解析 —— SAX 010304_XML解析 —— JDOM 010305_XML解析 —— DOM4J 010306_使用JavaScript操作DOM 010401_Tomcat服务器的安装及配置 020501_注释及Scriptlet 020502_page指令 020503_包含指令 020504_...

    Android程序技术:个人学习助手项目习题详情显示.pptx

    SAX解析 一个开源的Java项目,既可以用于Android应用,也可以用于JavaEE程序。Android中已经集成了PULL解析器。 PULL解析 XML解析 XML parsing XmlPullParser.START_DOCUMENT:XML文档的开始,如&lt;?xml

    Android 创建与解析XML(五)——详解Dom4j方式

    dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:...

    xerces-c++-3.1.3

    XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将其分别改名为 Xerces-C++ 和 Xerces-J。注...

    Java JDK实例宝典

    19 线程——BlockingQueue 第17章 Java与XML 17. 1 用DOM处理XML文档 17. 2 用SAX处理XML文档 17. 3 用XSLT转换XML 17. 4 对象与XML的转换 第18章 Java Mail 18. 1 使用SMTP协议发送...

    O r a c l e与X M L

    第2章介绍了Oracle的XML开发包(XML Developer's Kit,XDK)组件,回顾了Java/C/C++/ PLSQL等语言的XML解析器及XSLT处理程序、Java/C++语言的类生成器、以及Java TransViewer组件。用于访问及处理XML/XSL文件的可工作...

    老罗android开发视频教程全集百度网盘下载

    【第一版第四章】老罗Android开发视频--解析XML数据(3集) 【第一版第五章】老罗Android开发视频--解析JSON数据(4集) 【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗...

    java web 视频、电子书、源码(李兴华老师出版)

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    李兴华Java Web开发实战经典(高清版) Part2

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    Python编程入门经典

    3.1 引用数据——使用数据的 名称 29 3.1.1 使用名称修改数据 30 3.1.2 复制数据 31 3.1.3 禁用的名称以及一些规则 31 3.2 使用更多的内置类型 31 3.2.1 元组——不可更改的数据 序列 32 3.2.2 列表——可以更改的...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 ...

    Android典型技术模块开发详解

    第12章 数据解析 12.1 XML 12.1.1 DOM 12.1.2 SAX 12.1.3 PULL 12.2 JSON格式 12.2.1 基本类型 12.2.2 数组和集合 12.2.3 类对象 12.3 JSON解析 12.4 Gson 12.4.1 简单对象类型转换 12.4.2 数组和集合类型转换 12.5 ...

Global site tag (gtag.js) - Google Analytics