JavaWeb学习日记----SAX解析XML

1.SAX解析XML文档的方式:

  与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。优点是可以很方便实现增删改操作。缺点是,如果文件过大,会造成内存溢出。而SAX方式解析XML是采用事件驱动,边读便解析:从上到下,一行一行的解析,解析到某一个对象时,返回对象名称。优点是不会造成内存溢出,可以很方便实现查询操作,缺点是不能实现增删改操作。

2.在使用jaxp中的sax解析器之前,需要先获得sax解析器:

  1)调用SAXParserFactory.newInstanse()方法得到创建SAX解析器的工厂

  2)调用工厂对象的newSAXParse()方法得到saxParse解析器对象

  3)  调用解析器对象的Parser()方法解析XML文档,该方法的参数有两个,XML文档所在路径和驱动事件对象。即: parse(File f, DefaultHandler dh)

       或:parse(String url, DefaultHandler dh)

需要注意的是:在解析xml文档之前,我们需要自定义一个类,这个类继承自DefaultHandler,然后重写startElement()、characters()、endElement()这三个方法。

3.有如下XML文档

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
    <草帽海贼团>
        <船长>路飞</船长>
        <厨师>山治</厨师>
        <航海士>娜美</航海士>
        <船医>乔巴</船医>
        <音乐家>布鲁克</音乐家>
        <能力者>路飞</能力者>
        <能力者>乔巴</能力者>
        <能力者>布鲁克</能力者>
    </草帽海贼团>
    <草帽海贼团>
        <副船长>索隆</副船长>
        <考古学家>罗宾</考古学家>
        <狙击手>乌索普</狙击手>
        <船工>弗兰奇</船工>
        <能力者>罗宾</能力者>
    </草帽海贼团>
</海贼王>

需求:获得第一个<能力者>标签的内容

代码如下:

package cn.roger.Jaxp;

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;

/*
 * 使用Jaxp中的sax解析XML文档
 */
public class SaxTest1 {
    public static void main(String[] args) throws Exception {
        // 创建解析器
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        //创建事件驱动
        MyHandler dh = new MyHandler();
        parser.parse("src/OnePiece.xml", dh);
    }
}

class MyHandler extends DefaultHandler {
    boolean flag = false;
    int index = 0;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equals("能力者")) {
            flag = true;
            index++;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (flag && index == 1) {
            System.out.println(new String(ch, start, length));
            flag = false;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // System.out.print("</" + qName + ">");
    }

}

运行结果:

转载于:https://www.cnblogs.com/fxxk/p/10728676.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值