JSP与XML的结合(5)

分类: Jsp   出处:iocblog整理  更新时间:2008-12-06   添加到收藏  

  void endelement(string namespaceuri, string localname, string qname):这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
  我们还是沿用讲dom的时候使用的那个文档例子,但首先,我们先看一个简单一些的应用,我们希望能够统计一下xml文件中各个标签出现的次数。这个例子很简单,但是足以阐述sax编程的基本思路了。一开始当然还是import语句了:

import org.xml.sax.helpers.defaulthandler;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;
import java.io.*; 

  然后,我们创建一个继承于defaulthandler的类,具体的程序逻辑在这儿可以暂且放在一边,要注意的是程序的结构:

public class saxcounter extends defaulthandler {
private hashtable tags; //这个hashtable用来记录tag出现的次数
// 处理文档前的工作
public void startdocument() throws saxexception {
tags = new hashtable();//初始化hashtable
}
//对每一个开始元属进行处理
public void startelement(string namespaceuri, string localname,
string rawname, attributes atts)
throws saxexception
{
string key = localname;
……

  我们来看看这段程序作了些什么。在main()方法中,主要做的就是创建解析器,然后解析文档。实际上,在这儿创建saxparser对象的时候,为了使程序代码于具体的解析器无关,使用了同dom中一样的设计技巧:通过一个saxparserfactory类来创建具体的saxparser对象,这样,当需要使用不同的解析器的时候,要改变的,只是一个环境变量的值,而程序的代码可以保持不变。这就是factorymethod模式的思想。在这儿不再具体讲了,如果还有不明白的,可以参看上面dom中的解释,原理是一样的。
  不过在这儿还有一点点要注意的地方,就是saxparser类和xmlreader类之间的关系。你可能有些迷糊了吧,实际上saxparser是jaxp中对xmlreader的一个封装类,而xmlreader是定义在sax2.0种的一个用来解析文档的接口。你可以同样的调用saxparser或者xmlreader中的parser()方法来解析文档,效果是完全一样的。不过在saxparser中的parser()方法接受更多的参数,可以对不同的xml文档数据源进行解析,因而使用起来要比xmlreader要方便一些。
  这个例子仅仅涉及了sax的一点皮毛,而下面的这个,可就要高级一些了。下面我们要实现的功能,在dom的例子中已经有实现了,就是从xml文档中读出内容并格式化输出,虽然程序逻辑看起来还是很简单,但是sax可不比dom哦,看着吧。
  前面说过,当遇到一个开始标签的时候,在startelement()方法中,我们并不能够得到这个标签在xml文档中所处的位置。这在处理xml文档的时候是个大麻烦,因为在xml中标签的语义,有一部分是由其所处的位置所决定的。而且在一些需要验证文档结构的程序中,这更是一个问题。当然,没有解决不了的问题了,我们可以使用一个栈来实现对文档结构的纪录。
  栈的特点是先进先出,我们现在的想法是,在startelemnt()方法中用push将这个标签的名字添加到栈中,在endelement()方法中在把它pop出来。我们知道对一个结构良好的xml而言,其嵌套结构是完备的,每一个开始标签总会对应一个结束标签,而且不会出现标签嵌套之间的错位。因而,每一次startelement()方法的调用,必然会对应一个endelement()方法的调用,这样push和pop也是成对出现的,我们只需要分析栈的结构,就可以很容易的知道当前标签所处在文档结构中的位置了。

public class saxreader extends defaulthandler {
java.util.stack tags=new java.util.stack();
……

  在这儿虽然没有使用到栈的分析,但实际上栈的分析是一件很容易的事情,应为java.util.stack继承了java.util.vector类,而且stack中的元素是按栈的结构由底至上排列的,因个,我们可以使用vector类的size()方法来得到stack的元素个数,还可以使用vector的get(int)方法来得到具体的每一个元属。实际上,如果把stack的元素从底向上逐一排列出来,我们就得到了从xml根节点到当前节点的一条唯一的路径,有了这条路径的信息,文档的结构就在清楚不过了。
  到目前为止,我们已经掌握了对于xml编程的两大利器:dom和sax,也知道了该如何在一个java程序中使用它们。dom编程相对简单,但是速度比较慢,占用内存多,而s ax编程复杂一些,但是速度快,占用内存少。所以,我们应该根据不同的环境选择使用不同的方法。大部分的xml应用基本都可以用它们来解决。需要特别说明的是,dom和sax其实都是语言无关的,并非java所独有,也就是说,只要有相应的语言实现,dom和sax可以应用在任何面向对象的语言中。
 (来源 www.iocblog.net)

上一页 [1] [2] [3] [4] [5]



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。