Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载。

javax.xml.parsers.SAXParser类提供了一些函数,采用事件处理方式解析XML文档,这个类实现了XMLReader接口,提供了重载的parse()方法从File,InputStream,SAX InputSource和URI字符串中读取XML文档。
实际的XML解析工作由Handler类来完成,我们需要创建自己的Handler类,这就需要我们实现org.xml.sax.ContentHandler接口。这个接口中包含当事件发生时接收通知的回调方法,例如 StartDocument, EndDocument, StartElement, EndElement, CharacterData等等。

org.xml.sax.helpers.DefaultHandler提供了ContentHandler接口的默认实现,因此我们可以继承该类实现自己的处理类。继承这个类是明智的选择,因为我们可能只需要实现一些方法。继承这个类可以保证代码的简洁和可维护性。
下面是我们要解析的XML文档:
employees.xml

<?xml version="1.0" encoding="UTF-8"?>
<Employees><Employee id="1"><age>29</age><name>Pankaj</name><gender>Male</gender><role>Java Developer</role></Employee><Employee id="2"><age>35</age><name>Lisa</name><gender>Female</gender><role>CEO</role></Employee><Employee id="3"><age>40</age><name>Tom</name><gender>Male</gender><role>Manager</role></Employee><Employee id="4"><age>25</age><name>Meghna</name><gender>Female</gender><role>Manager</role></Employee>
</Employees>

该XML文件内容存放一些员工的信息,每个员工包含id属性和age, name, gender,role字段。
我们將使用SAX解析机制处理XML文件并创建员工对象列表。
我们使用Employee类抽象员工的信息:Employee.java

package com.journaldev.xml;public class Employee {private int id;private String name;private String gender;private int age;private String role;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}@Overridepublic String toString() {return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +" Role=" + this.role;}}

接着继承DefaultHandler类创建自己的Handler类MyHandler.java

package com.journaldev.xml.sax;import java.util.ArrayList;
import java.util.List;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import com.journaldev.xml.Employee;public class MyHandler extends DefaultHandler {//List to hold Employees objectprivate List<Employee> empList = null;private Employee emp = null;//getter method for employee listpublic List<Employee> getEmpList() {return empList;}boolean bAge = false;boolean bName = false;boolean bGender = false;boolean bRole = false;@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {if (qName.equalsIgnoreCase("Employee")) {//create a new Employee and put it in MapString id = attributes.getValue("id");//initialize Employee object and set id attributeemp = new Employee();emp.setId(Integer.parseInt(id));//initialize listif (empList == null)empList = new ArrayList<>();} else if (qName.equalsIgnoreCase("name")) {//set boolean values for fields, will be used in setting Employee variablesbName = true;} else if (qName.equalsIgnoreCase("age")) {bAge = true;} else if (qName.equalsIgnoreCase("gender")) {bGender = true;} else if (qName.equalsIgnoreCase("role")) {bRole = true;}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if (qName.equalsIgnoreCase("Employee")) {//add Employee object to listempList.add(emp);}}@Overridepublic void characters(char ch[], int start, int length) throws SAXException {if (bAge) {//age element, set Employee ageemp.setAge(Integer.parseInt(new String(ch, start, length)));bAge = false;} else if (bName) {emp.setName(new String(ch, start, length));bName = false;} else if (bRole) {emp.setRole(new String(ch, start, length));bRole = false;} else if (bGender) {emp.setGender(new String(ch, start, length));bGender = false;}}
}

MyHandler类持有一个存放Employee对象的List引用,它只有一个对应的getter方法。Employee对象在事件处理函数中被添加到List对象,在MyHandler类中还定义了Employee对象和它的几个字段相关的boolean类型变量用于创建Employee对象,当Employee对象的所有属性都被设置时,它就会被添加到list中。
我们重写了几个重要的方法startElement(), endElement() 和characters().
当SAXParser 开始解析文档时遇到元素的开始标签时,startElement() 方法就会被调用,我们重写了这个方法,使用boolean类型变量来区分元素类别。我们也是在该方法中,当Employee 标签开始时创建Employee 对象。
当SAXParser遇到元素中的字符串数据时characters()方法会被调用,我们使用boolean类型字段为Employee对象的属性进行赋值。
endElement()方法则会在SAXParser 遇到XML结束标签时会被调用,在这里我们將Employee对象添加到List对象中。
在下面的测试程序中,我们使用MyHandler解析XML文档生成存放Employee 对象List。
XMLParserSAX.java

package com.journaldev.xml.sax;import java.io.File;
import java.io.IOException;
import java.util.List;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import com.journaldev.xml.Employee;public class XMLParserSAX {public static void main(String[] args) {SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();try {SAXParser saxParser = saxParserFactory.newSAXParser();MyHandler handler = new MyHandler();saxParser.parse(new File("/Users/pankaj/employees.xml"), handler);//Get Employees listList<Employee> empList = handler.getEmpList();//print employee informationfor(Employee emp : empList)System.out.println(emp);} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}}}

运行程序输出:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java Developer
Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEO
Employee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager
Employee:: ID=4 Name=Meghna Age=25 Gender=Female Role=Manager

SAXParserFactory 类提供了工厂方法来获取SAXParser 实例,在调用 SAXParser对象的parse方法时传入Handler对象来处理回调事件。SAXParser解析机制刚开始接触时有点复杂,但是当你致力于处理大型的XML文档时,它比DOM解析提供了更有效的解析机制。
原文地址:http://www.journaldev.com/1198/java-sax-parser-example-tutorial-to-parse-xml-to-list-of-objects

JavaXml教程(五)使用SAX方式解析XML文件相关推荐

  1. Android中使用SAX方式解析XML文件

    转载http://blog.csdn.net/cjjky/article/details/6666834 在Android中解析XML文主要有三种方式,分别为Simple API for XML(SA ...

  2. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. java使用SAX接口解析xml文件

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用SAX接口解析xml文件.实现解析类,从xml解析开始到结尾,每一步均会触发对象的重载函数. 测试代码,将book1.xml改成你自己 ...

  4. php xml expat,php 使用expat方式解析xml文件操作示例

    本文实例讲述了php 使用expat方式解析xml文件操作.分享给大家供大家参考,具体如下: test.xml: George John Reminder George2 John2 Reminder ...

  5. JavaXml教程(二)使用DOM方式解析XML文件

    DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...

  6. Java眼中的XML--文件读取--2 应用SAX方式解析XML

    1.获取一个SAXParserFactory的实例.2.通过factory获取SAXParser实例. 3.新建一个包和继承自DefaultHandler的类. 因为SAX遍历方式,比如便利一个节点& ...

  7. Hello Qt(三十九)——SAX方式解析XML

    一.SAX简介 SAX是Simple API for XML的简写,是一种解析XML文件的替代方法,不是由W3C官方所提出的标准,是一种事件驱动的XML API,接近于底层,速度较快,但不便于随机访问 ...

  8. sax dom html解析xml,Python通过DOM和SAX方式解析XML的应用实例分享

    XML.DOM 需求 有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样. 上游跑时会根据配置从源文件中提取,到入库这一步需要根据配置进行建表. ...

  9. DOM方式解析XML文件实例

    books.XML文件: <?xml version="1.0" encoding="utf-8"?> <bookstore>      ...

最新文章

  1. 在ASP.NET 2.0中使用样式、主题和皮肤
  2. 生物信息学、系统生物学 期刊 会议
  3. 信安 | 网上吵个架都能被封号?是“黑科技”还是“黑产”?
  4. iOS sqlite
  5. WCHAR char CString等常用类型互转
  6. 计算一个人出生了多少天(炸窝)
  7. Linux——grep文本搜索命令
  8. 语法分析程序的设计与实现_编译工程7:语法分析(5)
  9. 推荐Python互动艺术在线编辑器(腾讯扣叮)
  10. 计算机术语仿真,计算机仿真-精.ppt
  11. max计算机什么函数,计算机max函数使用方法
  12. 自动驾驶 Apollo 源码分析系列,感知篇(一)
  13. 【乌拉喵.教程】LocalBus总线介绍及FPGA总线编程
  14. 基于STM32根据DL/T 645-2007通讯协议利用RS485进行抄表并将电压等数据利用HC-05蓝牙实时传输至上位机显示
  15. cadence修改板框倒角_Allegro软件中如何对板框进行倒角及倒角不成功解决方法
  16. Java实现HighCharts纯后台图表生成
  17. 基于BOM搭建的生产管理系统——物料清单
  18. Nginx中的长连接
  19. 干货 | 代理模式Mock平台在携程的应用
  20. html对齐多个输入框,jsprompt多个输入框

热门文章

  1. maven中阿里云镜像依赖无法加载的解决方案
  2. 虚拟机中的ubuntu16.04如何连接网络?
  3. android 手机听筒和扬声器切换 听筒没声音问题
  4. 中国第二家!理想汽车美股上市 特斯拉蔚来们怎么看?
  5. 互联网 Java 工程师面试题(Spring 面试题一)
  6. 【数据结构】——二叉树详解
  7. 阿姨家弟弟跟你差不多大,怎么还一颗都没掉呢?”马晓娟问。
  8. JVM性能优化(四)提高网站访问性能之Tomcat优化
  9. 准备蓝桥杯--dyx--数列特征
  10. app架构升级,4面字节跳动拿到Offer,3面直接拿到offer