JSP与XML的结合

作者:凯旋网络来源:凯旋网络
的过程)一个个顺序的被抛出,相应的方法也会被顺序的调用,最后,当解析完成,方法都被调用后,对文档的处理也就完成了。下面的这个表,列出了在解析上面的那个XML文件的时候,顺序被调用的方法:

  遇到的项目 方法回调

{文档开始} startDocument()
<POEM> startElement(null,"POEM",null,{Attributes})
"\n" characters("<POEM>\n...", 6, 1)
<AUTHOR> startElement(null,"AUTHOR",null,{Attributes})
"Ogden Nash" characters("<POEM>\n...", 15, 10)
</AUTHOR> endElement(null,"AUTHOR",null)
"\n" characters("<POEM>\n...", 34, 1)
<TITLE> startElement(null,"TITLE",null,{Attributes})
"Fleas" characters("<POEM>\n...", 42, 5)
</TITLE> endElement(null,"TITLE",null)
"\n" characters("<POEM>\n...", 55, 1)
<LINE> startElement(null,"LINE",null,{Attributes})
"Adam" characters("<POEM>\n...", 62, 4)
</LINE> endElement(null,"LINE",null)
"\n" characters("<POEM>\n...", 67, 1)
</POEM> endElement(null,"POEM",null)
{文档结束} endDocument() 

  ContentHandler实际上是一个接口,当处理特定的XML文件的时候,就需要为其创建一个实现了ContentHandler的类来处理特定的事件,可以说,这个实际上就是SAX处理XML文件的核心。下面我们来看看定义在其中的一些方法:
  void characters(char[] ch, int start, int length):这个方法用来处理在XML文件中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的起始位置和长度,我们可以很容易的用String类的一个构造方法来获得这个字符串的String类:String charEncontered=new String(ch,start,length)。
  void startDocument():当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
  void endDocument():和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
  void startElement(String namespaceURI, String localName, String qName, Attributes atts):当读到一个开始标签的时候,会触发这个方法。在SAX1.0版本中并不支持名域,而在新的2.0版本中提供了对名域的支持,这儿参数中的namespaceURI就是名域,localName是标签名,qName是标签的修饰前缀,当没有使用名域的时候,这两个参数都未null。而atts是这个标签所包含的属性列表。通过atts,可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,在遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。
  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的类,具体的程序逻辑在这儿可以暂

  • 广告推荐