Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277268
  • 博文数量: 83
  • 博客积分: 2393
  • 博客等级: 大尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-24 15:14
文章分类

全部博文(83)

文章存档

2019年(21)

2011年(5)

2010年(2)

2009年(1)

2008年(9)

2007年(33)

2006年(12)

我的朋友

分类: Java

2006-06-01 11:05:33

参考:
sax 是Simple API for XML的缩写,它并不是由W3C官方所提出的标准,可以说是“民间”的事实标准。
SAX与DOM比较而言,SAX是一种轻量型的方法。
SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。
所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。(如果你对Java新的代理事件模型比较清楚的话,就会很容易理解这种机制了)
在XMLReader接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很大。解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义了很多方法,比如startDocument(),它定制了当在解析过程中,遇到文档开始时应该处理的事情。当XMLReader读到合适的内容,就会抛出相应的事件,并把这个事件的处理权代理给ContentHandler,调用其相应的方法进行响应。
SAX的ContentHandler工作流程如下
在文档开始的时候调用startDocument(),在遇到节点是调用startElement(),然后通过characters将节点的值读取出来
在遇到节点结束时调用endElement(),文档结束时调用endDocument().
startDocument()
    | 
   \|/----------
startElement() |
    |          |
   \|/         |
characters()   |
    |          |
   \|/         |
endElement()---
    |
   \|/
endDocument()
读取xml文件的所有内容就是在在上述5个方法中添加自己的代码用来实现自己的需要。
startElement(string namespaceURI,String localName,String rawName,Attributes atts)
namespaceURI是xml文件的名域(这个不太明白),locaName是标签名称(这个也不太明白),
rawName是xml文件中使用<>括起来的内容如读取到时rawname就是person,
atts是这个person的属性列表。
characters(char[] ch,int start,int length)方法中ch是xml文件内容适用字符数组的方式组织后的数组,
start表示的时节点内容的值在ch数组中的开始位置,length表示的节点内容在ch数组中的长度
通过以上三个参数可以将节点的内容转化成String 类型 即:value=new String(ch,start,length);
void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName)
这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
因为ContentHandler是一个接口,在使用的时候可能会有些不方便,因而,SAX中还为其制定了一个Helper类:DefaultHandler,它实现了这个接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重载相应的方法即可。

自己感觉sax不大好用,没有使用dom的方式比较方便。
下面是自己做的一个例子
读取xml文件流程是:首先从DefaultHandler类继承下来,在继承类型中覆盖
读取xml文件的startDocument();startElement(),endElement(),endDocument()方法。
然后声称一个SAXParserFactory类的实例 spf,由spf的getParser方法得到SAXParser实例sp,
通过sp实例来调用xml文件和自己定一个文件处理handler接口。

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.*;
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.*;
import java.util.*;
 
public class TestXML  extends DefaultHandler{
  private Hashtable htab;
  private ArrayList list;
  public void startDocument()throws SAXException{
      htab=new Hashtable();
      list=new ArrayList();
  }
  public void startElement(String spaceNameURI,String localName,
                           String rawName,Attributes atts) throws SAXException{
   
    String key=localName;
    System.out.println("localName :"+localName);
    System.out.println("rawName :"+rawName);
    System.out.println("attrs.getValue:"+atts.getLength());
  }
  public void endDocument() throws SAXException{   
  }
  public void characters(char[] ch,int start,int length) throws SAXException{
      System.out.println(ch);
      System.out.println("start:"+start);
      System.out.println("length:"+length);
      System.out.println(new String(ch,start,length));
  }
  public TestXML() {
  }
 
  public static void main(String[] args) {
    TestXML testXML1 = new TestXML();
   
    String filename="c:\\test.xml";
    SAXParserFactory   spf= SAXParserFactory.newInstance();
    try{
      SAXParser parser=spf.newSAXParser();
      parser.parse(new File(filename),testXML1);
      System.out.println(testXML1.htab.get(new String("name")));
    }catch(Exception e){
      System.out.println(e.getMessage());
    }
   
  }
}

test.xml文件的内容如下:


Ogden Nash
Fleas
Adam
阅读(3760) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~