首页 > 其他分享 >DOM与SAX的区别

DOM与SAX的区别

时间:2023-03-28 10:09:07浏览次数:37  
标签:XML 区别 DOM SAX 文档 内存 读入



DOM与SAX的区别 (2011-05-08 18:48)


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,调用其相应的方法进行响应。

标签:XML,区别,DOM,SAX,文档,内存,读入
From: https://blog.51cto.com/u_16034393/6153805

相关文章

  • 有状态应用 和 无状态应用的区别
    专业点的例子:无状态:任意一个Web请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息(认证信息等)有状态:Web请求端的请求必须被提交到保存有其相关状态信息(......
  • dom4j 解析xml string 字符串
    packagedom4j;importjava.util.Iterator;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.DocumentHelper;importorg.dom4j.......
  • 引用和指针的区别
    1、定义和性质不同1、指针是一个变量,存储的地址,指向内存单元2、引用是变量的别名,跟原始变量是同一块内存inta=10;int*p=&a;//p是指针,&在此是取地址运算in......
  • git reset, git checkout, git revert 区别 (译)
    题记:团队中大多数成员使用sourceTree和github两款git工具,然而大家对于图形化工具提供的reset,checkout,revert功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。......
  • toString()、String.valueOf、(String)强转,有啥区别?
    toString(),可能会抛空指针异常这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以java对象都可以调用此方法。但在使用时要注意,必须保证object不是nul......
  • 利用dom4j修改XML数据_进行增删改查【最新】
    下面只发studentDao与util的源码:代码已经测试过了,没有问题,如果有需要的调整,会修改,如有错误请帮忙改正,下午整理了一下修改,其实跟查询差不多,只是设置一下元素体即可,代码已经更......
  • C#中抽象方法与虚方法的区别详解及示例
    1.抽象方法与虚方法的区别  先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽象类无法实例化,所以......
  • C#中重写(override)及覆盖(new)的区别详解
    1.重写和覆盖的定义1.1重写(override)的定义  在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法......
  • 线程和进程的区别【Android面试送命题】
    这道题面试出现的概率是百分之70下面我来讲下如何回答1,进程是资源管理的最小单位,线程是程序执行的最小单位2,每个进程都有自己的数据段代码段和堆栈段。线程通常叫做轻型......
  • JS之BOM、DOM
    https://www.cnblogs.com/12345huangchun/p/10171146.html一、BOM对象1,window对象所有浏览器都支持window对象,从概念上讲:一个HTML文档对应一个window对象,从功能......