Java 中使用Sax技术解析XML文档

  1. Sax解析机制
    Sax 的全称为Simple APIs for XML ,也即XML简单运用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列的事件,并激活相应的事件处理函数,应用程序通过对这些事件处理函数实现对XML文档的访问,因而SAX 接口也被称作事件驱动接口。
    Sax分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存的要求比较低,因此实现的效率比较高,对于那些只需要访问XML文档中的数据而不对XML文档进行更改的应用程序来说,Sax分析器更为合适。

  2. 常用的SAX 处理事件


  • startDocument() : 告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档

  • endDoucument():告诉你解析器发现了文档尾

  • startElement():告诉你解析器发现了一个起始标签,该事件告诉你元素的名称,该元素的名称,该元素所有的属性名和值

  • character():告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度变量,有这三个变量你可以得到解析器所发现的文本

  • endElement():告诉你解析器发现了一个结束标签,该事件告诉你元素的名称


  3. Java中使用SAX技术解析XML文档的具体实现
package com.ywendeng.java.demo2;

import java.io.File;
import java.util.Stack;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/*
 * 使用Sax来解析xml文档
 */
public class Sax {

    public static void main(String[] args) throws Exception, SAXException {
        //1.获得SAX解析器工厂实例
        SAXParserFactory  factory=SAXParserFactory.newInstance();
        //2.获得sax 解析器实例
        SAXParser parser=factory.newSAXParser();
        //3.开始进行解析
        parser.parse(new File("xml15.xml"), new MyHandler());

    }

}
class MyHandler extends DefaultHandler{

    private Stack<String> stack=new Stack<String>();

    private String name;
    private String gender;
    private String age;


    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
             stack.push(qName);
             for(int i=0;i<attributes.getLength();i++){
                 String attrName=attributes.getQName(i);
                 String attrValue=attributes.getValue(i);
                 System.out.println(attrName+" ="+attrValue);
             }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String tag=stack.peek();
        if("姓名".equals(tag)){
            name=new String(ch,start,length);
        }
        else if("性别".equals(tag)){
            gender=new String(ch,start,length);
        }else if("年龄".equals(tag)){
            age=new String(ch,start,length);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        stack.pop();//表示该元素已经用完
        if("学生".equals(qName)){
            System.out.println("姓名:" + name);
            System.out.println("性别:" + gender);
            System.out.println("年龄:" + age);

            System.out.println();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值