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

2019-04-18 08:55:59来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java通过Access_JDBC30读取access数据库时无法获取最新插入的记

下一篇:SpringMVC 的运行原理