- 浏览: 223442 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
chowqh:
#修改指向我的hadoop安装目录 org.apache.s ...
Sqoop 1.99.3 安装 -
chowqh:
#修改指向我的hadoop安装目录 org.apache.s ...
Sqoop 1.99.3 安装 -
wuzhongfei:
sqoop1.99.3以后是不是全部取消了sqoop命令,例如 ...
Sqoop 1.99.3 安装 -
cyj0421129:
sqoop:000> show version -all ...
Sqoop 1.99.3 安装 -
mypeterhero:
请问,我的服务端也起来了如下:sqoop.sh server ...
Sqoop 1.99.3 安装
第一讲SAX解析器
提出问题:有个作家构思了一部小说,我们读者要想看到这部小说,有什么办法?
有人说了:可以让作家把构思的这部小说写下来,然后印刷出版,我们不就可以看啦。这就类似与我们上一章学过的DOM解析过程。先建造一个印刷工厂,再搭建一条用于印刷的流水线技术,然后作家的构思原稿经过加工,就生成了印刷版的书。我们就可以阅读了。
我们用java语言将以上DOM解析步骤写出来:(回顾上一讲内容)
第一步:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
实例化一个印刷工厂(factory)
第二步:DocumentBuilder builder = factory.newDocumentBuilder();
搭建一条用于印刷的流水线技术(builder)
第三步:Document document= builder.parse("new File("story.xml")");
作家的构思原稿(story.xml),经过流水线技术(builder)的加工(parse),就生成了一部小说(document对象)。
现在又有人问了,我不想这样等,要等作家把小说全部构想完,然后再出版,我才能看到,这样太慢了。
是呀!如果是部短片小说,有简短的故事情节,只有几千字,那我可以等作家构思、印刷出版,然后拜读。那如果这是部长篇小说,有很多故事情节,长达几十万字或者更多,那我岂不是要等到猴年马月呀?怎么办呢?
有个聪明人说了,我有个办法,可以利用网络呀。
有人搭腔了,是呀,直接公布到网上,就省去了印刷、装订的步骤,哈哈。
聪明人又说了,不是你想的那样,是这个样子。。。。。
我们可以建立一个网站,然后这位作家有一个专栏。现在作家就可以开始写了,作家每构思好一章,就在自己的专栏公布一章,一直到最后一章小说结束。作家每公布一章,我们读者就可以读到一章,紧随作家的脚步,等作家构思完最后一章,我们也就拜读完了,何乐而不为呢。这种跟随作家脚步的拜读方法,就类似与我们今天要学习内容:SAX解析XML文档的过程。
Ø 我们先来看一下SAX的定义:
SAX是Simple API for XML的缩写,翻译过来的意思是简易应用程序编写接口。SAX允许在读取文档时处理它,不必等待整个文档被存储之后才采取操作。
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
Ø SAX与DOM的比较:
DOM
SAX
在内存中建立文件树,不适于处理大型的XML文件;
依序读入文件并产生相对应事件,可以处理任何大小的XML文件;
可以随意存取文件树的任何部分,没有次数限制;
只能对文件按顺序剖析一遍,不支持对文件的随意存取;
可以随意修改文件树,从而修改了XML文件
只能读取XML文件内容,而不能修改;
易于理解,易于开发;
开发上比较复杂,需要自己来制作事件处理器;
已经在DOM基础之上建立了文件树。
对工作人员更灵活,可以用SAX建立自己的XML对象模型。
通过对SAX与DOM的分析,它们各有自己的不同应用领域。DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
Ø SAX工作机制:
SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。我们也可以把它称为授权事件模型。
那我们小说的例子来解读SAX工作机制中的事件驱动:
现在我们画出SAX的工作机制,如下图:
将SAX工作机制应用与实例中:
比如考虑下面一个简单的文档。
<?XML version="1.0"?>
<parts>
<part>TurboWidget</part>
</parts>
当SAX在处理这个文档的时候,它产生如下的一系列的事件:
StartDocument( )
StartElement( "parts" )
StartElement( "part" )
Characters( "TurboWidget" )
EndElement( "part" )
EndElement( "parts" )
EndDocument( )
这些我们都了解了之后,现在考虑用java如何创建和使用SAX。
Ø SAX对象的创建步骤:(SAX解析器的核心是事件处理机制)
1. 建造一个SAX解析工厂;
使用javax.xml.parsers包中SAXParserFactory类调用方法newInstance实例化一个解析器工厂对象.代码如下:
2. 创建工厂的一个SAX解析器;
使用Factory对象调用newnewSAXParser ()方法,创建一个SAXParser对象,也可以称为SAX解析器
3. 导入文件,使用解析器进行解析。
解析器创建完成后,就调用parse()方法解析XML文件.
Ø SAX解析XML(Example1.xml)文档过程:
详细的解析过程:
1. 发现XML文件,触发文件开始事件,监听器调用startDocument()方法处理;
2. 发现“员工名单”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
3. 发现<员工名单>和<员工>之间的空白符号,触发文本事件,监听器调用characters方法处理;
4. 发现“员工”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
5. 发现<员工>和<姓名>之间的空白符号,触发文本事件,监听器调用characters方法处理;
6. 发现“姓名”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
7. 发现<姓名>标记的文本内容,触发文本事件,监听器调用characters方法处理;
8. 发现“姓名”标记的结束标记,触发结束标记事件,监听器调用endElement()方法处理;
…………
17.发现XML文件结束,触发文件结束事件,调用endDocument()方法。
用java语言将这些步骤写出来:
完整Example1.java文件:
import javax.xml.parsers.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import java.io.*;
public class Example1{
public static void main(String args[]){
try{
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser saxParser=factory.newSAXParser();//创建SAX解析器
MyHandler handler=new MyHandler();//创建事件处理器
saxParser.parse(new File("Example1.xml"),handler);//绑定文件和事件处理者
System.out.println("该XML文件共有"+handler.count+"标记");
}
catch(Exception e)
{System.out.println(e); }
}
}
class MyHandler extends DefaultHandler{
int count=0;
public void startDocument(){//解析到文档开始时调用该方法
System.out.println("开始解析XML文件");
count++;
}
public void endDocument(){//解析到文档结束时调用该方法
System.out.println("解析文件结束");
count++;
}
public void startElement(String uri,String localName,String qName,Attributes atts){ //解析到标记开始时调用该方法
System.out.println("<"+qName+">");
count++;
}
public void endElement(String uri,String localName,String qName){//解析到标记结束时调用该方法
System.out.println("<"+qName+">");
count++;
}
public void characters(char[] ch,int start,int length){//解析到标记间的数据时调用该方法
String text=new String(ch,start,length);
System.out.println(text);
count++;
}
}
输出结果,如下图:
总结SAX解析XML文档的特点:
1. SAX提供的模型不允许对XML文件随机存取
如:当前解析到第3个Element,此时程序无法得到第5个Element的信息,因为还没有解析到第5个Element;同样也无法得到第1个 Element的信息,因为已经丢失了。当然可以通过声明变量保存解析过的数据,但这如同手动在内存中构造了某种数据结构,一般都是树型结构,这相当麻烦且没有必要,因为DOM恰恰提供了这样一个内存中的模型。
2. SAX模型中元素之间的横向移动困难
SAX提供的是层次型的解析,便利所有第1个Element的子节点(一直到叶子节点)后,才可能开始解析下一个兄弟Element。而且很难知道某一时刻,解析到了哪个层次节点了。DOM则可以很好的解决这个问题,可以方便的找到任何兄弟节点。
3. SAX是熊瞎子劈苞米
SAX是解析一个节点后回调一个方法,把该节点相关信息传送给调用者,然后丢弃这些信息,继续解析下一个节点。正是这样一个机制,使得SAX占用内存很少,它不会预存储整个XML文档,也不会在解析后保存任何解析结果。而DOM则正好相反,把整个XML加载进内存中,即使是延迟加载策略,也会浪费额外的性能为代价。所以当XML非常庞大的时候,还是需要首选SAX。
4. SAX的修改XML能力差
尽管SAX2.0提供了XMLWriter,但是大量的修改XML,还是不建议采用它来完成。XMLWriter更适合记录解析过程的日志。
自学检查:
学习了DOM解析和SAX解析,实现一个DOM和SAX结合的例子。
从已有的XML文档(Example2.xml)中提取数据创建一新的XML文档。
(1) 使用SAX从原XML文档中提取数据并存储。(提取<图书>标记下面的<名称>和<价格>,并且取价格>35的节点)
(2) 使用DOM创建一个新的XML文档
写出Example2.java文件的代码。
提出问题:有个作家构思了一部小说,我们读者要想看到这部小说,有什么办法?
有人说了:可以让作家把构思的这部小说写下来,然后印刷出版,我们不就可以看啦。这就类似与我们上一章学过的DOM解析过程。先建造一个印刷工厂,再搭建一条用于印刷的流水线技术,然后作家的构思原稿经过加工,就生成了印刷版的书。我们就可以阅读了。
我们用java语言将以上DOM解析步骤写出来:(回顾上一讲内容)
第一步:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
实例化一个印刷工厂(factory)
第二步:DocumentBuilder builder = factory.newDocumentBuilder();
搭建一条用于印刷的流水线技术(builder)
第三步:Document document= builder.parse("new File("story.xml")");
作家的构思原稿(story.xml),经过流水线技术(builder)的加工(parse),就生成了一部小说(document对象)。
现在又有人问了,我不想这样等,要等作家把小说全部构想完,然后再出版,我才能看到,这样太慢了。
是呀!如果是部短片小说,有简短的故事情节,只有几千字,那我可以等作家构思、印刷出版,然后拜读。那如果这是部长篇小说,有很多故事情节,长达几十万字或者更多,那我岂不是要等到猴年马月呀?怎么办呢?
有个聪明人说了,我有个办法,可以利用网络呀。
有人搭腔了,是呀,直接公布到网上,就省去了印刷、装订的步骤,哈哈。
聪明人又说了,不是你想的那样,是这个样子。。。。。
我们可以建立一个网站,然后这位作家有一个专栏。现在作家就可以开始写了,作家每构思好一章,就在自己的专栏公布一章,一直到最后一章小说结束。作家每公布一章,我们读者就可以读到一章,紧随作家的脚步,等作家构思完最后一章,我们也就拜读完了,何乐而不为呢。这种跟随作家脚步的拜读方法,就类似与我们今天要学习内容:SAX解析XML文档的过程。
Ø 我们先来看一下SAX的定义:
SAX是Simple API for XML的缩写,翻译过来的意思是简易应用程序编写接口。SAX允许在读取文档时处理它,不必等待整个文档被存储之后才采取操作。
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
Ø SAX与DOM的比较:
DOM
SAX
在内存中建立文件树,不适于处理大型的XML文件;
依序读入文件并产生相对应事件,可以处理任何大小的XML文件;
可以随意存取文件树的任何部分,没有次数限制;
只能对文件按顺序剖析一遍,不支持对文件的随意存取;
可以随意修改文件树,从而修改了XML文件
只能读取XML文件内容,而不能修改;
易于理解,易于开发;
开发上比较复杂,需要自己来制作事件处理器;
已经在DOM基础之上建立了文件树。
对工作人员更灵活,可以用SAX建立自己的XML对象模型。
通过对SAX与DOM的分析,它们各有自己的不同应用领域。DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
Ø SAX工作机制:
SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。我们也可以把它称为授权事件模型。
那我们小说的例子来解读SAX工作机制中的事件驱动:
现在我们画出SAX的工作机制,如下图:
将SAX工作机制应用与实例中:
比如考虑下面一个简单的文档。
<?XML version="1.0"?>
<parts>
<part>TurboWidget</part>
</parts>
当SAX在处理这个文档的时候,它产生如下的一系列的事件:
StartDocument( )
StartElement( "parts" )
StartElement( "part" )
Characters( "TurboWidget" )
EndElement( "part" )
EndElement( "parts" )
EndDocument( )
这些我们都了解了之后,现在考虑用java如何创建和使用SAX。
Ø SAX对象的创建步骤:(SAX解析器的核心是事件处理机制)
1. 建造一个SAX解析工厂;
使用javax.xml.parsers包中SAXParserFactory类调用方法newInstance实例化一个解析器工厂对象.代码如下:
2. 创建工厂的一个SAX解析器;
使用Factory对象调用newnewSAXParser ()方法,创建一个SAXParser对象,也可以称为SAX解析器
3. 导入文件,使用解析器进行解析。
解析器创建完成后,就调用parse()方法解析XML文件.
Ø SAX解析XML(Example1.xml)文档过程:
详细的解析过程:
1. 发现XML文件,触发文件开始事件,监听器调用startDocument()方法处理;
2. 发现“员工名单”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
3. 发现<员工名单>和<员工>之间的空白符号,触发文本事件,监听器调用characters方法处理;
4. 发现“员工”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
5. 发现<员工>和<姓名>之间的空白符号,触发文本事件,监听器调用characters方法处理;
6. 发现“姓名”的开始标记,触发开始标记事件,监听器调用startElement()方法处理;
7. 发现<姓名>标记的文本内容,触发文本事件,监听器调用characters方法处理;
8. 发现“姓名”标记的结束标记,触发结束标记事件,监听器调用endElement()方法处理;
…………
17.发现XML文件结束,触发文件结束事件,调用endDocument()方法。
用java语言将这些步骤写出来:
完整Example1.java文件:
import javax.xml.parsers.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import java.io.*;
public class Example1{
public static void main(String args[]){
try{
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser saxParser=factory.newSAXParser();//创建SAX解析器
MyHandler handler=new MyHandler();//创建事件处理器
saxParser.parse(new File("Example1.xml"),handler);//绑定文件和事件处理者
System.out.println("该XML文件共有"+handler.count+"标记");
}
catch(Exception e)
{System.out.println(e); }
}
}
class MyHandler extends DefaultHandler{
int count=0;
public void startDocument(){//解析到文档开始时调用该方法
System.out.println("开始解析XML文件");
count++;
}
public void endDocument(){//解析到文档结束时调用该方法
System.out.println("解析文件结束");
count++;
}
public void startElement(String uri,String localName,String qName,Attributes atts){ //解析到标记开始时调用该方法
System.out.println("<"+qName+">");
count++;
}
public void endElement(String uri,String localName,String qName){//解析到标记结束时调用该方法
System.out.println("<"+qName+">");
count++;
}
public void characters(char[] ch,int start,int length){//解析到标记间的数据时调用该方法
String text=new String(ch,start,length);
System.out.println(text);
count++;
}
}
输出结果,如下图:
总结SAX解析XML文档的特点:
1. SAX提供的模型不允许对XML文件随机存取
如:当前解析到第3个Element,此时程序无法得到第5个Element的信息,因为还没有解析到第5个Element;同样也无法得到第1个 Element的信息,因为已经丢失了。当然可以通过声明变量保存解析过的数据,但这如同手动在内存中构造了某种数据结构,一般都是树型结构,这相当麻烦且没有必要,因为DOM恰恰提供了这样一个内存中的模型。
2. SAX模型中元素之间的横向移动困难
SAX提供的是层次型的解析,便利所有第1个Element的子节点(一直到叶子节点)后,才可能开始解析下一个兄弟Element。而且很难知道某一时刻,解析到了哪个层次节点了。DOM则可以很好的解决这个问题,可以方便的找到任何兄弟节点。
3. SAX是熊瞎子劈苞米
SAX是解析一个节点后回调一个方法,把该节点相关信息传送给调用者,然后丢弃这些信息,继续解析下一个节点。正是这样一个机制,使得SAX占用内存很少,它不会预存储整个XML文档,也不会在解析后保存任何解析结果。而DOM则正好相反,把整个XML加载进内存中,即使是延迟加载策略,也会浪费额外的性能为代价。所以当XML非常庞大的时候,还是需要首选SAX。
4. SAX的修改XML能力差
尽管SAX2.0提供了XMLWriter,但是大量的修改XML,还是不建议采用它来完成。XMLWriter更适合记录解析过程的日志。
自学检查:
学习了DOM解析和SAX解析,实现一个DOM和SAX结合的例子。
从已有的XML文档(Example2.xml)中提取数据创建一新的XML文档。
(1) 使用SAX从原XML文档中提取数据并存储。(提取<图书>标记下面的<名称>和<价格>,并且取价格>35的节点)
(2) 使用DOM创建一个新的XML文档
写出Example2.java文件的代码。
发表评论
-
ubuntu下eclipse的svn插件使用javahl
2014-06-11 17:37 137Failed to load JavaHL Library. ... -
资源文件中获取IP地址及端口号
2014-06-09 15:19 62package com.hn.util; ... -
记录记录记录记录
2014-05-05 10:08 0# deb cdrom:[Ubuntu 13.04 _Rari ... -
吃饭问题
2014-05-05 09:07 0package com.hn.java.hnUtil. ... -
常用正则表达式(实用)
2013-11-22 21:44 0匹配中文字符的正则表达式: [u4e00-u9fa5] ... -
JAVA中定时器
2013-06-30 12:18 697package com.hn.se; import ... -
groovy源码
2013-03-06 00:24 0在Linux操作系统中,有 ... -
ant 执行到javac时停止
2013-02-20 21:20 598在ant构建文件上右击,点击"run as" ... -
JAVA解析XML技术
2013-01-15 23:04 0见以下附件, -
dom4j读取Excel内容
2012-11-13 18:52 0见附件中…… java获取当前类的路径1.如何获得当前文 ... -
Hbase使用实例
2012-10-30 23:10 0root@debian:/opt/software/hbase ... -
Java导出Excel源码
2012-09-22 00:18 835Java导出Excel源码.txt -
java读取EXCEL
2012-09-22 00:02 761java读取EXCEL实例,见如下附件: -
openCMS安装过程
2012-07-25 22:33 379准备工作:安装JDK,mysql,tomcat 1.先从 ... -
线程调试
2011-12-08 21:58 688定义:指按照特定的机制为多个线程分配CPU的使用权 分类:A ... -
关于死锁
2011-12-08 21:29 886死锁的条件: 1.互斥条件:线程使用的资源必须至少有一 ... -
表驱动法【找出初次出现并且出现最多的字母】
2011-10-16 14:28 1183package com.houning; public cl ... -
JAVA JNI 实例--HelloWorld
2011-06-24 22:52 1083JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAV ... -
使用ANT把J2EE工程发布到Tomcat里
2011-05-17 17:23 1203本人在clipse中使用的 <?xml version= ... -
Struts2.1.8所需要的所有的jar文件
2011-05-17 07:57 840Struts2.1.8所需要的所有的jar文件 很全的, ...
相关推荐
2021 年 1 月第 32 卷第 1 期中国科技期刊研究,2021,32( 1) : 99 - 109课题组成员: 潘云涛、马峥、张玉华、王海燕、俞征鹿、翟丽
2. **优化势场力**: 在计算势场力时考虑更多因素,如距离、速度等,使得无人车能够在更复杂的情况下作出合理的避障决策。 #### 动态障碍物的处理 无人车在行驶过程中可能会遇到动态障碍物,如其他行驶中的车辆或...
二是影响大学生网上开店的可靠性;三是影响大学生网上开店的发展前景。 在研究中,我们采用了文献综述法、案例分析法和实验法等多种研究方法,收集和分析了大量的文献和数据,对电子商务中的诚信问题进行 了深入的...
在进一步的技术讨论中,文章引用了孟庆华、杨鹏飞和翟丽等人的研究工作。孟庆华提出基于ADVISOR建立的动力系统模型,并进行了仿真分析和验证,但其研究主要集中在电机与蓄电池的参数匹配上,并未进行更深入的性能...
《项目计划与控制》是一门针对项目管理硕士课程设计的核心课程,旨在培养学生的项目管理能力,...参考教材包括卢向南主编的《项目计划与控制》以及毕星和翟丽的相关著作,这些资料将提供更深入的理论探讨和实践指导。