博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DOM和SAX是应用中操纵XML文档的差别
阅读量:6932 次
发布时间:2019-06-27

本文共 4702 字,大约阅读时间需要 15 分钟。

查看原文:
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为加载到内存的文档节点建立类型描写叙述。终于,这些描写叙述呈现了可easy横向移动、潜

在巨大、树型结构。

假设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解析xmlimport 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
SAX解析XMLpackage 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
XML文件例如以下: 

> <row> <person> <name>王小明</name> <college>信息学院</college> <telephone>6258113</telephone> <notes>男,1955年生,博士。95年调入海南大学</notes>

转载地址:http://uywnl.baihongyu.com/

你可能感兴趣的文章
CSS a:hover伪类在IE6下的问题
查看>>
js转码函数
查看>>
三层交换机工作原理(转载)
查看>>
Android面试知识点(转)
查看>>
Struck: Structured Output Tracking with Kernels
查看>>
delphi调用外部程序并等待其运行结束
查看>>
BZOJ 1426 收集邮票 ——概率DP
查看>>
【转】BT5汉化步骤
查看>>
老版本select2设置初始值
查看>>
TessorFlow学习 之 序言
查看>>
代码荣辱观-以运用风格为荣,以随意编码为耻
查看>>
Java基础概念(一)
查看>>
iOS 排序算法总结、二分法查找
查看>>
oracle查询语句注意事项:
查看>>
第166天:canvas绘制饼状图动画
查看>>
Reporting service个人使用经验
查看>>
数学2.Latex扫盲
查看>>
去除Coding4Fun中MessagePrompt的边框(Border)
查看>>
参数文件
查看>>
各指数的历史-市盈率平均估值
查看>>