DOM&SAX解析XML

  在上一篇随笔中分析了xml以及它的两种验证方式。我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOMSAX,其中DOM是W3C官方的解析方式,而SAX是民间(非官方)的,两种解析方式是很不一样的。下面通过例子来分析两种解析方式的区别。

下面是要解析的xml文档

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <学生名册>
 3 <!--http://www.cnblogs.com/zhi-hao/-->
 4     <学生 学号="A1">
 5         <姓名>CIACs</姓名>
 6         <性别>男</性别>
 7         <年龄>22</年龄>
 8     </学生>
 9     <学生 学号="A2">
10         <姓名>zhihao</姓名>
11         <性别>男</性别>
12         <年龄>23</年龄>
13     </学生>
14 </学生名册>

DOM(Document Object Model)文档对象模式,从名字上就可以知道,DOM应该是基于文档对象来解析的。在DOM解析方式中主要用到了以下四个接口

1、Document接口,该接口是对xml文档进行操作的入口,要想操作xml,必须获得文档的入口。

2、Node接口,存储xml文档的节点的

3、NodeList接口

4、NameNodeMap接口,存储的是xml中的属性。

DOM中的基本对象有Document,Node,NodeList,Element和Attr。有了这些就可以解析xml了

 1 package xmlTest;
 2
 3 import java.io.File;
 4
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7
 8 import org.w3c.dom.Attr;
 9 import org.w3c.dom.Document;
10 import org.w3c.dom.Element;
11 import org.w3c.dom.NamedNodeMap;
12 import org.w3c.dom.Node;
13 import org.w3c.dom.NodeList;
14 /**
15  *
16  * @author CIACs
17  * 2014-09-22
18  */
19
20 public class DOM {
21
22     public static void main(String[] args) throws Exception {
23         //获得解析工厂实例
24         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
25         //通过工厂获得DocumentBulider
26         DocumentBuilder db = dbf.newDocumentBuilder();
27         //获得文档对象的入口
28         Document doc = db.parse(new File("student.xml"));
29         //获得根元素
30         Element root = doc.getDocumentElement();
31         //开始解析
32         parseElement(root);
33     }
34     private static void parseElement(Element element)
35     {
36         String tagName = element.getNodeName();
37         System.out.print("<"+tagName);
38         //获得元素属性
39         NamedNodeMap map = element.getAttributes();
40         if(null != map)
41         {
42             for(int i = 0;i < map.getLength();i++)
43             {
44                 Attr attr = (Attr)map.item(i);
45                 String attrName = attr.getName();
46                 String attrValue = attr.getValue();
47                 System.out.print(" "+attrName + "=\""+attrValue+"\"");
48             }
49         }
50         System.out.print(">");
51
52         //获得元素的孩子节点
53         NodeList child = element.getChildNodes();
54
55         for(int i = 0;i < child.getLength();i++)
56         {
57             Node node = child.item(i);
58             //判断节点类型
59
60             short nodeType = node.getNodeType();
61
62             if(nodeType == Node.ELEMENT_NODE)
63             {
64                 parseElement((Element)node);
65             }
66             else
67                 if(nodeType == Node.TEXT_NODE)
68                 {
69                     System.out.print(node.getTextContent());
70                 }
71                 else
72                     if(nodeType == Node.COMMENT_NODE)
73                     {
74                         System.out.print("<!--"+node.getTextContent()+"-->");
75                     }
76         }
77         System.out.print("</"+tagName+">");
78     }
79 }

DOM

输出结果:

当然你可以直接输出内容,不用控制格式。

SAX(Simple APIs for XML)面向xml的简单APIs。SAX解析xml的一般步骤如下

1、创建SAXParserFactory对象; SAXParserFactory spf = SAXParserFactory.newInstance();

2、使用上面创建的工厂对象创建SAXParser解析对象;SAXParser sp = spf.newSAXParser();

3、创建SAXHandler处理器,而这个SAXHandler类要继承DefaultHandler,自己重新编写其中的方法,主要有 public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException{ } 这个方法是在读取xml数据的节点元素开始时触发,需要实现这个方法进行标记元素的名字的操作; public void characters(char[] ch, int start, int length)throws SAXException{ } 这个方法可以处理节点之间的数据;  public void endElement(String uri, String ocalName, String qName)throws SAXException { } 这个方法在处理节点元素终止时触发,可添加代码来将节点数据进行存储。

下面是解析xml的代码

 1 package xmlTest;
 2
 3 import java.io.File;
 4 import javax.xml.parsers.SAXParser;
 5 import javax.xml.parsers.SAXParserFactory;
 6
 7 import org.xml.sax.Attributes;
 8 import org.xml.sax.SAXException;
 9 import org.xml.sax.helpers.DefaultHandler;
10
11 /**
12  *
13  * @author CIACs
14  * 2014-09-22
15  */
16
17 public class Sax {
18     public static void main(String []args)
19     {
20         try
21         {
22             //获得sax解析工厂实例
23             SAXParserFactory spf = SAXParserFactory.newInstance();
24             //获得sax解析器
25             SAXParser sp = spf.newSAXParser();
26             //获得SAXHandler,该类是继承自DefaultHandler的
27             SAXHandler handler = new SAXHandler();
28             //开始解析xml文档
29             sp.parse(new File("student.xml"), handler);
30
31         }
32         catch(Exception e)
33         {
34             e.printStackTrace();
35         }
36     }
37
38 }
39
40 class SAXHandler extends DefaultHandler
41 {
42      private String currentElement;
43      private String currentValue;
44      private String attrName;
45      private String attrValue;
46     @Override
47     public void startElement(String uri, String localName, String qName,
48             Attributes attributes) throws SAXException {
49         currentElement = qName;
50         for(int i = 0;i < attributes.getLength();i++)
51         {
52             attrName = attributes.getQName(i);
53             attrValue = attributes.getValue(i);
54             System.out.println("属性: "+ attrName + "=" + attrValue);
55         }
56
57     }
58      @Override
59     public void characters(char[] ch, int start, int length)
60             throws SAXException {
61         currentValue = new String(ch,start,length);
62     }
63      @Override
64     public void endElement(String uri, String localName, String qName)
65             throws SAXException {
66
67          if(currentElement.equals(qName))
68          {
69              System.out.println(currentElement + "=" + currentValue);
70          }
71     }
72 }

Sax

输出结果:

这里我也是直接输出xml的内容,并没有写到硬盘,在实际应用时你可以把内容存在Map中。

总结:

  通过上面的两个解析实例,我们可以看出DOM解析XML时,首先将xml文档整个加载到内存中,然后就可以随机访问内存中的文档对象树(dom解析器是把xml解析成树形结构的)。SAX是基于事件的而且是顺序的,就是读到某个标签时就会调用相应的方法,一旦经过了某个元素之后,我们就没办法再去访问了。DOM由于要把整个xml加载到内存中,所以当xml很大时,内存就可以能会溢出,而SAX不用事先把xml文档加载到内存中,占用内存小,相对而言SAX是面向xml的简单APIs,在开发上比较复杂,要开发者去实现事件处理器,但会更灵活,而DOM会更易于理解和开发。对于大型的xml文档,我们通常会使用SAX的方式去解析。

时间: 2024-10-07 23:44:52

DOM&SAX解析XML的相关文章

XML引入,DOM 方式解析XML 原理,SAX 方式解析XML

XML 简介 Xml(eXtensible Markup Language) 即可扩展标记语言.提供了一套跨平台.跨网络.跨程序的语言的数据描述方式,使用XML 可以方便地实现数据交换.系统配置.内容管理等常见功能. 元素VS 节点 节点包括元素节点.属性节点.文本节点:元素一定是节点,但是节点不一定是元素: <?xml version="1.0" encoding="UTF-8"?> <emp> <empName empNo=&quo

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr

SAX解析XML

SAX 事件处理(事件驱动),不需要载入整个文档,流机制读取,分析XML文档 startDocument startElement character endElement endDocument 当sax扫描到文档时就调用startDocument函数,sax扫描到文档结束符时就调用endDocument函数,也就是说当sax扫描到哪个节点时就会调用相应的函数,同时还会携带节点的属性值. 当它扫描到节点内容值时就会调用character函数 Sax主要是用来对xml文件遍历,解析,不提供修改.

6. SAX解析XML

SAX解析: SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分: 解析器和事件处理器 : 1. 解析器可以使用SAXP的API创建,创建出SAX解析器后, 就可以指定解析器去解析某个XML文档. 解析器采用SAX方式在解析某个XML文档时, 它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法, 解析器在调用事件处理器的方法时, 会把当前解析到的xml文件内容作为方法的参数传递给事件处理器. 2. 事件处理器由程序员编写,程序员通过事件处理器

SAX解析XML文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准.SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有 优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强.使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器.SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 在SAX接口中,事件源是org

android学习二十二(使用SAX解析xml)

上一篇博客是使用Pull解析xml文件的,Pull解析方式虽然非常好用,但它并不是我们唯一的选择.SAX解析也是一种特别常用的XML解析方式,虽然它的用法比Pull解析复杂,但在语义方面会更加的清楚. 通常情况下我们都会新建一个类继承自DefaultHandler,并重写父类的五个方法,如下所示: package com.jack.networktest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import

Python:使用基于事件驱动的SAX解析XML

SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 您可能已经知道语法分析器有两类接口 - 基于对象的(如:DOM)和基于事件(如:SAX)的接口. DOM是基于对象的语法分析器的标准 API. 作为基于对象的接口,DOM 通过在内存中显示地构建对象树来与应用程序通信.对象树是 XML 文件中元素树的精确映射. DOM 易于学习和使用,因为它与基本

JAVA SAX解析XML文件

[代码] [Java]代码view sourceprint?001package SAXparse;002 003 004import java.io.FileInputStream;005import java.lang.reflect.Array;006import java.lang.reflect.InvocationTargetException;007import java.lang.reflect.Method;008import java.text.ParseException;

Python—使用xml.sax解析xml文件

什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处理器则负责对事件作出相应,对传递的XML数据进行处理. sax适于处理下面的问题: 1.对大型文件进行处理: 2.只需要文件的部分内容,或者只需从文件中得到特定信息: 3.想建立自己的对象模型的时候. 在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sa