zoukankan      html  css  js  c++  java
  • 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 + ">");
        }
    
    }

    运行结果:

  • 相关阅读:
    384. 最长无重复字符的子串
    406. 和大于S的最小子数组
    159. 寻找旋转排序数组中的最小值
    62. 搜索旋转排序数组
    20. 骰子求和
    125. 背包问题 II
    92. 背包问题
    1295. 质因数统计
    471. 最高频的K个单词
    1339. 最大区间
  • 原文地址:https://www.cnblogs.com/fxxk/p/10728676.html
Copyright © 2011-2022 走看看