浅谈用java解析xml文档(二)

    上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点!

    SAX(Simple API for XML),是指一种接口,或者一个软件包.

    首先我们应该知道SAX解析和dom解析的区别:

    dom是树结构解析,易于理解和开发,它可以随意访问文件所在的节点位置,易于修改,删除和查询。但对于dom文档过大时,则会解析较慢。

    而SAX解析是事件推动型,顺序读取文件的节点,且只能读取文档的内容,不能对文档的内容进行修噶,对文档的大小没有过多的限制,但开大复杂度较高,

    下面介绍一个SAX解析xml文档的几个关键步骤:

     (1)、创建XML解析处理器,即SAXParseFactory 的实例,

        SAXParserFactory factory = SAXParserFactory.newInstance();

  (2)、通过factory创建SAX解析器

        SAXParser parser = factory.newSAXParser();

      (3)、通过SAXParse 的实例,创建xml解析处理器。对文档进行解析,

        parser.parse(uri,handler)   方法有两个参数uri , handler对象,uri就是我们的文档的路径,

        接下来我们需要创建一个handler对象,我们创建一个Myhandler类,这个Myhandler类需要继承DefaultHandler类,

        Myhandler handler = new Myhandler();

               下面是我们的Myhandler的实例代码。

  1 package com.imooc.handler;
 2
 3 import org.xml.sax.Attributes;
 4 import org.xml.sax.SAXException;
 5 import org.xml.sax.helpers.DefaultHandler;
 6
 7 /*
 8  * 解析xml处理器
 9  *
10  * */
11 public class Myhandler extends DefaultHandler{
12     String value = null;
13     /**
14      * 用来标识解析开始
15      */
16     @Override
17     public void startDocument() throws SAXException {
18         // TODO Auto-generated method stub
19         super.startDocument();
20         System.out.println("SAX解析开始");
21     }
22
23     /**
24      * 用来标识解析结束
25      */
26     @Override
27     public void endDocument() throws SAXException {
28         // TODO Auto-generated method stub
29         super.endDocument();
30         System.out.println("SAX解析结束");
31     }
32
33     /**
34      * 解析xml元素
35      */
36     @Override
37     public void startElement(String uri, String localName, String qName,
38             Attributes attributes) throws SAXException {
39         // TODO Auto-generated method stub
40         super.startElement(uri, localName, qName, attributes);
41         if (qName.equals("book")) {
42             int num = attributes.getLength();
43             for(int i = 0; i < num; i++){
44                 System.out.print("book元素的第" + (i + 1) +  "个属性名是:"
45                     + attributes.getQName(i));
46                 System.out.println("---属性值是:" + attributes.getValue(i));
47
48             }
49         }else if (!qName.equals("name") && !qName.equals("bookstore")) {
50
51             System.out.print("节点名是:" + qName + "---");
52         }
53     }
54
55     @Override
56     public void endElement(String uri, String localName, String qName)
57             throws SAXException {
58         // TODO Auto-generated method stub
59         super.endElement(uri, localName, qName);
60
61     }
62
63     @Override
64     public void characters(char[] ch, int start, int length)
65             throws SAXException {
66         // TODO Auto-generated method stub
67         super.characters(ch, start, length);
68         value = new String(ch, start, length);
69         if (!value.trim().equals("")) {
70             System.out.println("节点值是:" + value);
71         }
72     }
73
74
75
76 }

      (4)、测试主程序入口

      

 1 public static void main(String[] args) {
 2
 3         SAXParserFactory factory = SAXParserFactory.newInstance();
 4
 5         try {
 6             SAXParser parser = factory.newSAXParser();
 7
 8             Myhandler handler = new Myhandler();
 9             parser.parse("books.xml", handler);
10
11         } catch (ParserConfigurationException e) {
12             // TODO Auto-generated catch block
13             e.printStackTrace();
14         } catch (SAXException e) {
15             // TODO Auto-generated catch block
16             e.printStackTrace();
17         } catch (IOException e) {
18             // TODO Auto-generated catch block
19             e.printStackTrace();
20         }
21     }

    books.xml文件,

      

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <bookstore>
 3     <book id="1">
 4         <name>老人与海</name>
 5         <author>海明威</author>
 6         <year>1955</year>
 7         <price>45</price>
 8     </book>
 9     <book id="2">
10         <name>书剑恩仇录</name>
11         <year>1959</year>
12         <price>24</price>
13         <language>chinese</language>
14     </book>
15 </bookstore>

输出的结果为:

    

SAX解析开始
book元素的第1个属性名是:id---属性值是:1
节点值是:老人与海
节点名是:author---节点值是:海明威
节点名是:year---节点值是:1955
节点名是:price---节点值是:45
book元素的第1个属性名是:id---属性值是:2
节点值是:书剑恩仇录
节点名是:year---节点值是:1959
节点名是:price---节点值是:24
节点名是:language---节点值是:chinese
SAX解析结束

    这样我们就完成了最基本的SAX解析xml文档。

    总结:

    优点:对内存要求比较低,对文档中的部分数据来进行解析开发速度快,而且扩展能力强。

    缺点:用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂

        

时间: 2024-10-27 03:11:13

浅谈用java解析xml文档(二)的相关文章

浅谈用java解析xml文档(四)

继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使用dom4j解析,个人认为是四种解析方式里面最方便的一种,DOM4J是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用D

浅谈用java解析xml文档(三)

接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析.生成.序列化及其它操作. 我们从以下步骤开始解析: (1).通过JDOM的API创建一个SAXBuilder的对象 SAXBuilder saxBuilder

浅谈用java解析xml文档(一)

关于xml本身的语法及使用的环境不多说了,网上有很多规则, 然对xml文档进行解析,一般分为四种解析方式,基于java官方文档的Dom 和Sax解析,还有就是基于 第三方jar包的 Jdom 和 Dom4j解析. 一.首先我们来看Dom解析: 1.定义工厂,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 在应用程序获取对 DocumentBuil

Java 解析XML文档

一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优点是,占用资源更少,内存消耗小. XML文档: <?xml version="1.0" encoding="UTF-8"?> <students> <student> <name>张三</name> <age>20</

org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 2.解析器:DocumentBuilder 创建方法:通过解析器工厂类来获得 DocumentBu

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

Java对XML文档的解析

1. DOM解析 DOM的全称是Document Object Model,也即文档对象模型.DOM解析会将XML文档以对象树的方式存入内存,因此,DOM解析内存消耗巨大.当然由于DOM解析将XML以节点树的方式调入内存,所以对文档进行增删改查(crud)比较方便.DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高.而且,对于结构复杂的树的遍历也是一项耗时的操作.所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想. ---

Java高级特性 第14节 解析XML文档(2) - SAX 技术

一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口. 1. SAX解析原理: 加载一点,读取一点,处理一点.对内存要求比较低. SAX解析工具内置在jdk中:org.xml.sax.*

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用