DOM和SAX是应用中操纵XML文档的区别

DOM和SAX是应用中操纵XML文档的两种主要API,它们分别解释如下:

DOM,即Document Object Model,中文叫文档对象模型。DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的、用于内存存储和操作层次化文档的模型。当按 照DOM模型解析XML文档时,就会在内存中构造一个对应的DOM树,它可以用于不同

节点之间的遍历。然而,在遍历之前必须先完成DOM树的构造。因此, 在处理规模较大的XML文档时就很耗内存,占用资源较多。尤其是只需要操作文档中一小部分时效率很低。

SAX,即Simple API for XML的简称,中文叫XML简单应用程序接口。它是一个事实上的标准。与DOM不同的是,它是用事件驱动模型。解析XMl文档时每遇到一个开始或者结束标 签、或者属性、或者一条指令时,程序就产生一个事件来进行相应的处理。所以在操作文档之前不需要对整个文档进行解析。实际上,文档的各个部分可以在进行解 析的同时进行操作。因此,SAX相对于DOM来说更适合操作大文档。

SAX与DOM之间有一些显著区别,包括:

DOM是复杂对象处理的首选,比如当XML比较复杂的时候,或者当你需要随机处理文档中数据的时候。SAX从文档的开始通过每一节点移动,以定位一个特定的节点。 DOM为载入到内存的文档节点建立类型描述。最终,这些描述呈现了可容易横向移动、潜

在巨大、树型结构。如果XML很冗长,DOM就会显示出无法控制的胀 大。例如,一个300KB的XML文档可以导致RAM或者虚拟内存中的3,000,000KB的DOM树型结构。通过比较就会发现,

一个SAX文档根本就 没有被解构,它也没有隐藏在内存空间中(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。SAX就是一种“更轻巧的”技术──它可以给你的系统 带来更轻的负担。SAX相当于观看一场马拉松比赛,而DOM就好比邀请所有的比赛选手到家里参加晚餐。

所以,你如何选择SAX和DOM?如果你处理复杂的东西,比如高级XSLT转换,或者Xpath过滤,请选择使用DOM。如果你建立或者更改XML文档,你也可以选择DOM。相反,你可以使用SAX来查询或者阅读XML文档。SAX可以快速扫描一个大型的XML文档,当它找到查询标准时就会立即停止,然后再处理之。在某些情况下,在一个方案中,最佳的选择是使用DOM和SAX处理不同的部分。例如,你可以使用DOM将XML载入到内存并改变它,然后通过从DOM树中发送一个SAX流而转移最后的结果。

SAX概念

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准,可以说是“民间”的事实标准。实际上,它是一种社区性质的讨论产物。虽然如此,在XML中对SAX的应用丝毫不比DOM少,几乎所有的XML解析器都会支持它。

与DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需 求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候,一个较好的替代解决方法就是SAX。

SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是 SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。(如果你对Java新的代理事件模型比较清楚的话,就会很容 易理解这种机制了)

在XMLReader接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很 大。解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义 了很多方法,比如startDocument(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。当XMLReader读到合适的内容,就会抛 出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应

dom解析xml
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMParsePage {
public DOMParsePage() {
                DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
    try {
                DocumentBuilder dombuilder=domfac.newDocumentBuilder();
                InputStream is=new FileInputStream("C:/123.xml");
                Document doc=dombuilder.parse(is);
                Element root=doc.getDocumentElement();
                NodeList books=root.getChildNodes();
          if(books!=null){
                for(int i=0;i<books.getLength();i++){
                        Node book=books.item(i);
                        for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling())
                        {
                             if(node.getNodeType()==Node.ELEMENT_NODE){
                                    if(node.getNodeName().equals("title")){
                                           String bookname=node.getFirstChild().getNodeValue();
                                            System.out.println(bookname);
                                     }
                                    if(node.getNodeName().equals("author")){
                                           String author1=node.getFirstChild().getNodeValue();
                                            System.out.println(author1);
                                    }
                                   if(node.getNodeName().equals("description")){
                                          String addtime=node.getFirstChild().getNodeValue();
                                          System.out.println(addtime);
                                   }
                                  if(node.getNodeName().equals("pubDate")){
                                          String price=node.getFirstChild().getNodeValue();
                                          System.out.println(price);
                                  }
                            }
                      }
               }
          }
    }catch (ParserConfigurationException e) {
               e.printStackTrace();
     }catch (FileNotFoundException e) {
               e.printStackTrace();
     }catch (SAXException e) {
               e.printStackTrace();
     }catch (IOException e) {
              e.printStackTrace();
     }
}

public static void main(String[] args) {
           new DOMParsePage();
     }
}
 
SAX解析XML
package simpleTest;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
class TestSAX extends DefaultHandler
{
                private StringBuffer buf;
           public TestSAX()
          {
                super();
          }
          public void setDocumentLocator(Locator locator)
          {
          }
          public void startDocument() throws SAXException
          {
               buf=new StringBuffer();
               System.out.println("*******开始解析文档*******");
          }
          public void endDocument() throws SAXException
          {
              System.out.println("*******文档解析结束*******");
           }
          public void startPrefixMapping( String prefix, String uri )
          {
              System.out.println("\n前缀映射: " + prefix +" 开始!"+ " 它的URI是:" + uri);
          }
          public void endPrefixMapping( String prefix )
          {
              System.out.println("\n前缀映射: "+prefix+" 结束!");
          }
          public void processingInstruction( String target, String instruction ) throws SAXException {
           }
           public void ignorableWhitespace( char[] chars, int start, int length ) throws SAXException
           {
           }
          public void skippedEntity( String name ) throws SAXException
          {
          }
         public void startElement(String namespaceURI,String localName,String qName,Attributes atts)
          {
                 System.out.println("*******开始解析元素*******");
                 System.out.println("元素名"+qName);
                 for(int i=0;i<atts.getLength();i++)
                 {
                         System.out.println("元素名"+atts.getLocalName(i)+"属性值"+atts.getValue(i));
                   }
          }
         public void endElement(String namespaceURI,String localName,String fullName )throws SAXException
         {
                 System.out.println("******元素解析结束********");
          }
           public void characters( char[] chars, int start, int length )throws SAXException
          {
                 //将元素内容累加到StringBuffer中
                buf.append(chars,start,length);
           }
            public static void main(String args[])
          {
                  try{
                          SAXParserFactory sf = SAXParserFactory.newInstance();
                          SAXParser sp = sf.newSAXParser();
                          TestSAX testsax=new TestSAX();
                           sp.parse(new InputSource("D:\\test\\simpleTest\\classes\\simpleTest\\test.xml"),testsax);

              }catch(IOException e) {
                           e.printStackTrace();
                     }catch(SAXException e) {
                           e.printStackTrace();
                     }catch(Exception e) {
                           e.printStackTrace();
                     }
         }
} 
XML文件如下:
<?xml version="1.0" encoding="gb2312"?>
<row>
<person>
<name>王小明</name>
<college>信息学院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年调入海南大学</notes>
时间: 2024-10-07 05:31:47

DOM和SAX是应用中操纵XML文档的区别的相关文章

C#中的XML文档注释-推荐的文档注释标记

文档注释是为了方便自己和他人更好地理解代码所实现的功能.下面记录了一些常用的文档注释标记: <C> 用法: <c>text</c> 将说明中的文本标记为代码.例如: /// <summary> /// Validates the user. /// </summary> /// <param name="username">The username.</param> /// <param name

关于XML文档解析(DOM和SAX)

DOM解析方式是将整个XML文档以document形式构架在内存中,当XML文档很大时,可能会造成OOM(内存溢出).而SAX则是一行行的去解析的,速度很快. DOM解析: 1,通过DocumentBuilderFactory创建DOM解析工厂; 2,由工厂获取DocumentBuilder解析器对象; 3,通过解析器将XML转换成Document对象 注:在对XML文档进行修改后,需要利用TransFormerFactory对其进行更新. SAX解析: 1,通过SAXParserFactory

Spring中xml文档的schema约束

最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springfram

XML文档的解析

XML文档解析:操作xml文档,将文档中的数据读取到内存中  * 操作xml文档   1. 解析(读取):将文档中的数据读取到内存中   2. 写入:将内存中的数据保存到xml文档中.持久化的存储 * 解析xml的方式:   1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树    * 优点:操作方便,可以对文档进行CRUD的所有操作    * 缺点:占内存   2. SAX:逐行读取,基于事件驱动的.    * 优点:不占内存.    * 缺点:只能读取,不能增删改 * x

文档对象模型操作xml文档

简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规范化接口.DOM是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口,它以树状结构表示HTML和XML文档,定义了遍历这个树和检查.修改树的节点的方法和属性. DOM的核心API还允许你创建和填充文件.加载文档并保存. 2.2DOM实现 微软的net框架在Systemx.x

关于Spring配置文件xml文档的schema约束

最开始使用spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. [html] view plain copy print? <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:m

【Win 10应用开发】把文件嵌入到XML文档

把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML文档中会发生解析错误. 不知你是否想起XML文档有一种CData内容节点,它可以忽略对字符的解析处理,使用CData节点,可以存放base64字符串. 要在Win App中实现这种处理也不难. 读写XML文档有多种方法,既可以使用.net core中的类,也可以用Linq to XML,还可以用运行

XML文档类型定义---XML Schema结构

5.1 Schema概述 XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具. 使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它用不同于XML的语言编写,需要不同的分析器技术.这增加了工具开发商的负担,降低了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法.而XML Schema是按标准XML规则编写的,更容易掌握.二是DTD不支持名称空间.随着大部分的数据处理日益以XML为

如何控制XML文档的样式

xml文档是纯文本文件,虽然内容是完全自定义的,但显示的效果就差强人意了,那么是否可以让xml文档也像html文档那样可以有丰富多彩的显示效果呢?当然可以,html文档是通过css文档来控制显示样式的,xml文档可以通过xsl文档来控制,其实质就是把xml文档通过xslt(xsl transformations)转换成html文档,或者比html更严谨的xhtml文档. 那么如何读取xml文档中的数据呢?下面通过一个例子来实验一下: 首先看一下最原始的xml文档: 1 <?xml version