免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 989 | 回复: 0
打印 上一主题 下一主题

使用sax解析xml文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-01 11:05 |只看该作者 |倒序浏览
参考:http://www.jspcn.net/htmlnews/11049298737501253.html
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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18014/showart_121423.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP