sax与dom的区别

xml(或SGML)API主要有两种形式:
基于树的API,最常见的就是w3c的dom解析,java原生中也集成了这种解析方式,这种方式会将一个xml解析成为树的形式来处理并且是将整个xml放到内存中。

基于事件的API,也就是本次介绍的sax(Simple API for XML),它是直接通过处理不同的事件回调解析来处理xml,并不会建立维护一个内部的树,比如以下这种。

<?xml version="1.0"?>
<doc>
<para>Hello, world!</para>
</doc>

sax会将xml解析成为这样的一个一个事件去交给handler处理

start document
start element: doc
start element: para
characters: Hello, world!
end element: para
end element: doc
end document

基于树的API对于大多数的应用程序很有用,但通常会对系统资源造成极大的压力,尤其是在文档较大的情况下,因为它们会将整个文档读取到内存中。此外,许多应用程序需要构建自己的强类型数据结构,而不是使用与XML文档相对应的树结构,比如java这种,并且构建解析节点树,仅将其映射到新的数据结构然后丢弃原始数据树效率低下。
在这两种情况下,基于事件的API均提供了对XML文档的更简单,较低影响的访问,它可以解析比可用系统内存大得多的文档,还可以使用回调事件处理程序构造自己的数据结构。

sax解析

maven依赖

<!-- https://mvnrepository.com/artifact/dom4j/dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>

xml文件

<?xml version="1.0" encoding="UTF-8"?><Book> <book id="10003"><name>道斩乾坤</name><author>大梦笑笑生</author></book>
</Book>

Book实体类

public class Book {// 对应xml中id,name,authorprivate Long id;private String name;private String author;
}
sax解析有三个核心步骤:
  1. 获取xml解析器,因为java已经整合了sax,可以通过原生api获取
  2. 声明自定义解析器,sax会将读取到xml解析成事件传递给对应的事件处理器去处理,包括startElement(开始节点),endElement(结束节点),characters(节点内容)
  3. 注册自定义解析器,解析xml
/**获取xml解析器*/
public static XMLReader getInstance() throws Exception {// javax.xml.parsers.SAXParserFactory 原生api获取factorySAXParserFactory factory = SAXParserFactory.newInstance();// javax.xml.parsers.SAXParser 原生api获取parseSAXParser saxParser = factory.newSAXParser();// 获取xmlReaderXMLReader xmlReader = saxParser.getXMLReader();return xmlReader;
}

自定义解析器,如前文所讲,sax会将xml解析成一个个事件回调给事件处理器,这里MyHandler默认继承defaultHandler,实现了startElement,endElement,characters方法,startElement每次sax读取到一个element开始时都会调用这个方法,qName就是element的节点名字,attributes是对应的属性,节点内容会交给characters去处理,最后endElement是这个节点处理完毕时候调用。
整个解析事件

start document
start element: Book (qName Book)
start element: book (qName book,attributes id)
start element: name (qName name)
characters: 道斩乾坤
end element: name
start element: author (qName author)
characters: 大梦笑笑生
end element: author
end element: book
end element: Book
end document
// 这个事件解析器要完成的职责就是如果读取到开始节点是Book,则创建一个list,然后如果是book节点,则创建一个Book实体,
// 并且将id,name,author赋值给这个book实体,characters可以区分当前文本内容是name还是author是通过currentName去处理的
public class MyHander extends DefaultHandler {private List<Book> bookList;private Book book;private String currentName;@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// characters处理节点text内容,类似 道斩乾坤 这种if (currentName.equals("name")) {String s = new String(ch, start, length);book.setName(s);} else if (currentName.equals("author")){String s = new String(ch, start, length);book.setAuthor(s);}}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {currentName = qName;// qName是element名字,类似Bookif (qName.equals("Book")) {bookList = new ArrayList<Book>();}if (qName.equals("book")) {book = new Book();// attributes 是element的属性,类似id这种String id = attributes.getValue("id");book.setId(Long.valueOf(id));}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {currentName = "";// endElement 表示这个节点解析结束if (qName.equals("book")) {bookList.add(book);}}public List<Book> getBookList() {return bookList;}public void setBookList(List<Book> bookList) {this.bookList = bookList;}
}

解析,完整的代码,最后会将xml中的数据解析成为book

public class SaxReader {public static XMLReader getInstance() throws Exception {// javax.xml.parsers.SAXParserFactory 原生api获取factorySAXParserFactory factory = SAXParserFactory.newInstance();// javax.xml.parsers.SAXParser 原生api获取parseSAXParser saxParser = factory.newSAXParser();// 获取xmlXMLReader xmlReader = saxParser.getXMLReader();return xmlReader;}public static void main(String[] args) throws Exception {XMLReader xmlReader = getInstance();// 注册自定义解析器MyHander myHander = new MyHander();xmlReader.setContentHandler(myHander);// 解析xmlxmlReader.parse(Sax.class.getClassLoader().getResource("Book.xml").getFile());// 获取解析结果List<Book> bookList =myHander.getBookList();System.out.println(bookList);}
}

sax解析xml详解相关推荐

  1. SAX解析XML 详解

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个 ...

  2. android用sax解析xml,详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...

  3. java dom_Java DOM 解析 XML详解

    W3C制定了一套书写XML分析器的标准接口规范--DOM. 除此以外,XML_DEV邮件列表中的成员根据应用的需求也自发地定义了一套对XML文档进行操作的接口规范--SAX. 这两种接口规范各有侧重, ...

  4. 详解SAX解析XML

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

  5. convert android layout xml,详解Android之解析XML文件三种方式(DOM,PULL,SAX)

    1.xml文件代码 ${fq.content} ${fq.time} 2.XML网页效果图 3.Android代码 1.布局文件 xmlns:tools="http://schemas.an ...

  6. xml文件的解析过程详解

    XML项目工程展示图如下图: student.xml 文件展示:<?xml version="1.0" encoding="utf-8" ?> &l ...

  7. android xml defaulthandler解析,sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个"你"当作android:),使用sax解析 ...

  8. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可 ...

  9. Web.xml详解(转)

    这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一.            Web.xml详解: (一)  web.xml加载过程(步骤) 首 ...

  10. python 使用sax 解析xml 文件

    这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可, SAX知识了解 SAX (simple API for XML )  有解析器和事件处理器 解析器负责读取XML文档,并向事件处理器 ...

最新文章

  1. C++/C++11中std::deque的使用
  2. 基于Vue的小日历(支持按周切换)
  3. 科学家都解决不了的5个“简单”算法,你不来看看?
  4. linux 命令 跳过yes,Linux命令之yes
  5. Py之terminaltables:terminaltables的简介、安装、使用方法之详细攻略
  6. 标记【新公司】!!!!!!!!!!
  7. 带你走进SAP项目实施过程——立项
  8. pip 不是内部或外部命令 也不是可运行的程序_QT之程序打包发布
  9. mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)
  10. python七段数码管绘制秒表_Python绘制七段数码管实例代码
  11. python函数修饰参数_Python 函数参数的填坑之路
  12. 本计算机的英文意思,电脑的英文什么意思最新见解
  13. 澳大利亚IT解决方案提供商使用OpManager节省了数万美元的IT维护成本
  14. Python 处理 PDF 的神器 -- PyMuPDF(上)
  15. 【Unity】入门级Unity安装教程
  16. SAP BASIS ADM100 中文版 Unit 7(1)
  17. 【算法】【c++】打家劫舍问题
  18. Java 面向对象(一)
  19. Linux Ubuntu常用软件
  20. 毫米波电路的PCB设计和加工(第一部分)

热门文章

  1. 航空以太网(ARINC664)接口测试工具
  2. SMILES的基本规则
  3. 单本振与双本振台标文件的区别在哪里?
  4. getParameterValues中文乱码
  5. Dreamweaver CS6的基本使用教程
  6. C++ Test的使用
  7. MTK平台 Android8.1 SD卡驱动能力修改
  8. 【base】串行口RS232的接口定义
  9. 教大家简单的软件项目标书写法
  10. ShadowGun Deadzone 放出 GM Kit Mod 包