XML中的SAX接口与DOM接口

原创 2007年09月30日 08:38:00
    DOM解析器通过对XML文档的分析,把整个XML文档以一棵DOM树的形式存放在内存中,应用程序可以随时对DOM树中的任何一个部分进行访问与操作,也就是说,通过DOM树,应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。

        然而,由于DOM解析器把整个XML文档转化成DOM树放在了内存中,因此,当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的操作。所以,DOM解析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM解析器的树结构的思想与XML文档的结构相吻合,而且,通过DOM树机制很容易实现随机访问。
    SAX解析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX解析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX解析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX解析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,检查是否符合XML语法并触发相应的事件。

        对于事件处理函数本身,要由应用程序自己来实现。同DOM分析器相比,SAX解析器对XML文档的处理缺乏一定的灵活性,然而,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX解析器的效率则更高。由于SAX解析器实现简单,对内存要求比较低,因此实现效率比较高。
    那么我们能不能把二者的优点结合起来,让SAX解析器获取相应的数据,用DOM解析器根据新的需要形成一个XML文件,下面通过一个案例,说明二者是怎样结合使用,首先创建一个XML文件,用来获取数据,打开记事本,在里面输入下列代码:
例8-14
<?xml version="1.0" encoding="GB2312" ?>
<学生成绩表>
  <学生>
    <学生姓名>王培</学生姓名>
    <学生成绩>56</学生成绩>
  </学生>
   <学生>
    <学生姓名>程雪方</学生姓名>
    <学生成绩>60</学生成绩>
  </学生>
   <学生>
    <学生姓名>周昌举</学生姓名>
    <学生成绩>34</学生成绩>
  </学生>
   <学生>
    <学生姓名>王尚</学生姓名>
    <学生成绩>78</学生成绩>
  </学生>
</学生成绩表>
 
    将该文件保存,文件名为Sax_14.xml。打开记事本在里面输入下列java代码:
例8-14
import javax.xml.parsers.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;
public class Sax_14{
     public static void main(String args[]){
           try{
              SAXParserFactory factory1=SAXParserFactory.newInstance();
              SAXParser saxParser=factory1.newSAXParser();
              MyHandler handler=new MyHandler();
              saxParser.parse(new File("Sax_14.xml"),handler);
              DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
              DocumentBuilder builder=factory.newDocumentBuilder();
              Document document=builder.newDocument();
              document.setXmlVersion("1.0");
              Element 学生姓名表=document.createElement("学生姓名表");
              document.appendChild(学生姓名表);
              for(int k=1;k<=handler.str1.length;k++){
                     学生姓名表.appendChild(document.createElement("学生"));
                 } 
              NodeList nodeList=document.getElementsByTagName("学生");
              int size=nodeList.getLength();
              for(int k=0;k<size;k++){
              Node node=nodeList.item(k);
              if(node.getNodeType()==Node.ELEMENT_NODE)
                        {
                          Element elementNode=(Element)node;
                          elementNode.appendChild(document.createElement("学生姓名"));
                        }
                      } 
             nodeList=document.getElementsByTagName("学生姓名");
             size=nodeList.getLength();
             for(int k=0;k<size;k++){
             Node node=nodeList.item(k);
             if(node.getNodeType()==Node.ELEMENT_NODE){
                         Element elementNode=(Element)node;
                         elementNode.appendChild(document.createTextNode(handler.str1[k]));
                      }
                  }  
         TransformerFactory transFactory=TransformerFactory.newInstance();
            Transformer transformer=transFactory.newTransformer();
            DOMSource domSource=new DOMSource(document);
            File file=new File("学生姓名表.xml");
            FileOutputStream out=new FileOutputStream(file);
            StreamResult xmlResult=new StreamResult(out);
            transformer.transform(domSource,xmlResult);
             }
          catch(Exception e){
              System.out.println(e);
             }
      }
}
class MyHandler extends DefaultHandler{
         String str1[]=new String[4];
          boolean letter=false;
          int i=0;
         public void startElement(String uri,String localName,String qName,Attributes atts) {
           if(qName.equals("学生姓名"))
              letter=true;
          }
         public void characters(char[] ch,int start,int length){
            String text=new String(ch,start,length);
            if(letter){
                 str1[i]=text.trim();
                 i++;
                 letter=false;
                  }
        }
  }
    将该文件保存,文件名为Sax_14.java。编译后解释执行,会自动产生一个“学生姓名表.XML”文件,该文件的源代码为:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<学生姓名表>
    <学生>
         <学生姓名>王培</学生姓名>
    </学生>
    <学生>
         <学生姓名>程雪方</学生姓名>
    </学生>
    <学生>
         <学生姓名>周昌举</学生姓名>
    </学生>
    <学生>
         <学生姓名>王尚</学生姓名>
    </学生>
</学生姓名表>
    对于java例子中的代码这里就不再解释了,这些都是前面用过的语句。

Java之DOM,SAX,JDOM,DOM4J,四种解析xml方法比较

4种解析方式的比较 1.DOM解析    优点:a.形成了树结构,直观好理解,代码更易编写          b.解析过程中树结构保留在内存中,方便修改 缺点:         a.当xml...
  • qq_31028891
  • qq_31028891
  • 2016年08月13日 21:29
  • 1502

XML解析的两种方式:DOM方式和SAX方式

DOM:Document ObjectModel,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。 SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-D...
  • u012526194
  • u012526194
  • 2015年09月26日 14:17
  • 3329

xml文件的解析解析方式及Dom解析与Sax解析的区别

一、简单概述你常见的xml解析方式 ①DOM
  • Crazy9599
  • Crazy9599
  • 2014年06月03日 19:20
  • 1074

java通过DOM接口访问XML文档

接上一博客,对XML大体了解,我的实习题目:基于XML的数据导入模块设计,我想需要对XML进行操作获得数据然后导入数据库,不知道思路对不对,今天粗略了解通过DOM访问XML。 首先编写简单XML :...
  • w33365
  • w33365
  • 2011年12月15日 22:26
  • 375

QT开发之XML(DOM接口)

XML是类似HTML的WEB前端标识符语言,这个比较简单,大家可以去学习一下,HTML+CSS+JS可以做一个非常不错的网站,我个人网站就是用这个框架开发的,也可以用JSP或PHP去开发,这里我们的重...
  • qq_21792169
  • qq_21792169
  • 2016年12月04日 23:55
  • 907

XML数据接口DOM入门介绍和常用对象

1、简介   xmlDOM被设计为可用于任何语言和任何操作系统。借助DOM,程序员可以创建xml文档、遍历其结构,增、改、删其元素。DOM将整个xml文档视作一棵树,文档级的元素是树的根 2.结构:...
  • u012543266
  • u012543266
  • 2014年01月17日 17:16
  • 846

读写xml封装类(封装了封锁的DOM读写xml文件的COM接口)

  • 2010年01月22日 09:12
  • 8KB
  • 下载

XML解析DOM/SAX/PULL

  • 2013年09月03日 18:02
  • 101KB
  • 下载

XML(SAX与DOM解析)内附实例与PPT

  • 2008年11月10日 19:37
  • 168KB
  • 下载

dom和sax对xml的解析

  • 2014年11月19日 10:09
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XML中的SAX接口与DOM接口
举报原因:
原因补充:

(最多只允许输入30个字)