上一节写到了如何使用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文档。
谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~
相关推荐
SAX解析常用于处理大型XML数据文件,如网络数据流、日志文件等。在Android开发中,当需要高效地处理大量XML数据,而又不关心文档的整体结构时,SAX解析器是理想的选择。 ### 结论 理解并熟练掌握SAX解析XML是...
本项目以“SAX”为焦点,探讨如何在Android中使用SAX解析器处理XML文件。SAX(Simple API for XML)是一种事件驱动的解析器,它不像DOM解析器那样将整个XML文档加载到内存中,而是逐行读取,因此在处理大型XML文件时...
2. **SAXParserFactory**:这是JAXP(Java API for XML Processing)的一部分,用于创建SAX解析器。通过`SAXParserFactory.newInstance()`获取工厂实例,然后调用`newSAXParser()`生成`SAXParser`,这个解析器同样...
本教程将介绍如何使用Java解析XML文件,并将解析结果导入MySQL数据库。 首先,我们需要引入处理XML的Java库——JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)API。JAXB用于对象与XML...
例如,对于DOM解析,可以创建`DOMParser`实例,然后使用`parse()`方法解析XML文档;对于SAX解析,可以实现`ContentHandler`接口,并注册到`SAXParser`中。同时,可以通过`XMLSchemaValidator`进行XML Schema验证。 ...
SAX解析XML的基本流程是:创建SAXParserFactory,通过该工厂实例化SAXParser,然后设置事件处理器(ContentHandler),最后解析XML文档。以下是SAX解析的关键步骤: - 首先,通过`SAXParserFactory.newInstance()`...
本教程将带你逐步了解如何使用Java解析XML文件。 首先,我们需要明白XML的基本结构。XML文档由元素(Element)、属性(Attribute)、文本内容(Text Content)和注释(Comment)组成。在给定的XML示例中,`...
标题中的"SAX与JAVA.rar"指的是Java编程语言中用于处理XML文档的一种解析器——SAX(Simple API for XML)。SAX是一种基于事件驱动的解析模型,它以流式的方式读取XML文档,逐个处理XML元素,而不是一次性加载整个...
本文将深入探讨XML数据在前后台解析的过程中,重点介绍两种主流的Java XML解析库——JDOM和DOM4J,并提供实际运行的程序示例。同时,我们还会讨论如何使用jQuery在前端解析XML并展示数据。 首先,让我们了解XML的...
有两种主要方法来解析XML中的特殊字符: **方法一:使用实体引用** 实体引用是XML中最常见的处理特殊字符的方式。当你需要在XML文档中插入特殊字符时,可以使用对应的实体引用。比如,如果你想在文本中包含一个...
Java解析XML的包——Xerces.jar是Java开发中用于处理XML文档的重要工具。XML(eXtensible Markup Language)是一种结构化数据表示语言,广泛应用于数据交换、配置存储和文档处理等领域。Xerces.jar包含了Apache ...
解析XML是将XML文档转换为程序可以理解的数据结构的关键步骤。本文将深入探讨XML解析的基本概念、常用方法以及相关的Java库——JDOM。 XML文档由一系列元素构成,每个元素都包含标签、属性和内容。解析XML的过程...
Dom方式创建与解析XML文档是一种使用编程语言,如Java,在Android平台实现的方式。这种方式利用了DOM(文档对象模型)的API,其中JAXP(Java API for XML Processing)提供的DocumentBuilder类是用来创建和解析XML...
#### 二、Java解析XML的基本原理 在Java中,主要存在两种解析XML的基本方法:DOM(Document Object Model)和SAX(Simple API for XML)。这两种方法分别适用于不同的场景,各有优劣。 ##### 1. DOM解析 DOM是一...
在`analysisXml`方法中,开发者使用了JDOM库来解析XML。JDOM是一个Java API,用于处理XML文档,它提供了构建、修改和操作XML文档的能力。以下是方法的主要步骤: 1. 创建一个`StringReader`对象,用于读取XML字符串...
本文将深入探讨两种主要的XML解析方法——SAX(Simple API for XML)和DOM(Document Object Model),并讲解如何使用它们来解析XML文件以及生成XML文件。 一、SAX解析XML SAX是一种事件驱动的解析器,它逐行扫描...
例如,你可以使用`Document document = DocumentHelper.parseText(xmlString)`来解析XML文本,然后通过`Element root = document.getRootElement()`获取根元素。 3. **xpp3-1.1.4c.jar**: 这个库是XPull解析器的...
SAX解析器不保存整个文档,因此内存占用小,适用于大文件。但是,由于其回调机制,开发者需要编写较多的事件处理代码,且无法轻松回溯到文档的其他部分。 3. StAX(Streaming API for XML) StAX是一种基于流的解析...
本篇文章将深入探讨Java解析XML的几种主要方法,以及相关的知识点。 首先,Java提供了两种主要的API来解析XML:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器将整个XML文档加载到内存中,...