DOM和SAX是应用中操纵XML文档的差别
因此, 在处理规模较大的XML文档时就非常耗内存,占用资源较多。
尤其是仅仅须要操作文档中一小部分时效率非常低。
因此,SAX相对于DOM来说更适合操作大文档。
DOM是复杂对象处理的首选,比方当XML比較复杂的时候,或者当你须要随机处理文档中数据的时候。
SAX从文档的開始通过每一节点移动。以定位一个特定的节点。 DOM为加载到内存的文档节点建立类型描写叙述。终于,这些描写叙述呈现了可easy横向移动、潜
假设XML非常冗长,DOM就会显示出无法控制的胀 大。比如,一个300KB的XML文档能够导致RAM或者虚拟内存中的3。000。000KB的DOM树型结构。
通过比較就会发现。
在某些情况下。在一个方案中,最佳的选择是使用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>
DOM和SAX是应用中操纵XML文档的差别的更多相关文章
- sax解析案例(javabean封装xml文档数据)
package itcast.sax; import java.io.IOException; import java.util.List; import javax.xml.parsers.Pars ...
- C#中的XML文档注释-推荐的文档注释标记
文档注释是为了方便自己和他人更好地理解代码所实现的功能.下面记录了一些常用的文档注释标记: <C> 用法: <c>text</c> 将说明中的文本标记为代码.例如: ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
- 使用SAX解析xml文档
1.首先,在main方法中解析xml文档,具体代码如下: import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import ...
- XML文档读取-DOM
DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口. W3C DOM ...
- xml文档读取-SAX
由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持: SAX,全称Simple API ...
- Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术
一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- Spring中xml文档的schema约束
最开始使用Spring框架的时候,对于其配置文件xml,只是网上得知其使用方法,而不明其意.最近想着寻根问底的探究一下.以下是本文主要内容: 1.配置文件示例. <?xml version= ...
随机推荐
- 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码
PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...
- zabbix 使用自带模板监控mysql
1.这里可以采用zabbix自带的mysql模版,但是也需要在mysql服务器上准备获取mysql status的脚本chk_mysql.sh,zabbix通过调用这个脚本来获取mysql的运行信息. ...
- idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD
在学习spring4+springmvc+mybatis的ssm框架,idea整合简单实现增删改查功能,在这里记录一下. 原文在这里:https://my.oschina.net/finchxu/bl ...
- Ubuntu上使用过的命令,Linux常用命令,mount 硬盘挂载, ls 列表list命令,cp 复制copy命令,mkdir 创建文件夹 ,nano 编辑器,cat 文档合并,chmod 文件权限,ssh win10连接ubuntu服务器的步骤
man 帮助 > man ls # ubuntu的帮助 tar.gz 压缩解压 > tar -zcvf yzn.tar.gz /home/yzn # 压缩 > tar -zxvf y ...
- vue26-2.0循环
3. 循环 2.0里面默认就可以添加重复数据 arr.forEach(function(item,index){ }); 去掉了隐式一些变量 $index $key 之前: v-for="( ...
- GitHub开源控件的使用合集
Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...
- 深入理解Android(5)——从MediaScanner分析Android中的JNI
前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...
- Huawei配置两台交换机堆叠示例
配置两台交换机堆叠示例(先配置后连线方式,推荐) 一.基本概念 在堆叠中,有以下一些基本概念,如图1所示.图1 堆叠基本概念示意图 1. 角色堆叠中的单台交换机称为成员交换机,按照功能不同可以分为以下 ...
- thinkserer TD350 系统损坏后,数据恢复及系统重做过程
电脑配置: 联想服务器 TD350 E5-2609V4 2*8G 2*4T+R1 塔式 单电 1.系统恢复: 试过很多种方法,均无效 2.数据恢复: 重新安装系统后,直接在D盘查找 , 原C盘的 ...
- 实现人脸识别性别之路---opencv
import cv2from make_imge import get_file_namefrom train_ph import Modelimport os IMAGE_SIZE = 128if ...