第十二天-XML(SAX、Pull)

一、Dom(Document Object Mode)

1、特点

先把文档读到内存中,使用Dom来访问树形结构

2、缺点

比较耗内存,读取数据量大

二、SAX(Simple API XML)

1、定义

对文档进行顺序扫描,当扫描到四种情况(开始、结束文档、标签)的时候,会通知DefaultHandler中的方法(事件处理函数)一直重复这个动作,知道文档结束

2、优点

解析速度快,占用内存少

3、缺点

解析一个XML文件对应一个handler类,比较麻烦

4、特点

流式解析,解析是同步的读到那里就解析到那里

5、用法

1、自定义类继承DefaultHandler,重写四个方法(开始,结束文档和标签)
2、获得工厂 —SAXPorseFactory f = SAXPorseeFocatory.newInstance();
3、获得解析器—SAXParser p = f.newSAXParser();
4、设置解析文件和解析方式 —p.setParse(文件,第一步中的handler对象);
5、handler对象中的五个方法:
(1)、开始文档:初始化集合
(2)、结束文档:啥也不用写
(3)、开始标签:初始化对象,获得标签中的属性
(4)、结束标签:获得标签值 q.Name 添加集合
(5)、类型转换:new String(char[] , 0 , length);
(6)、返回该类集合:return ArrayList

6、代码

在这里插入图片描述

 class MyHandler extends DefaultHandler{

    String str; //用来存放解出来的字符串

    @Override //开始文档
    public void startDocument() throws SAXException {
        super.startDocument();

    }

    @Override //标签开始
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("book")){
            bean = new Bean();
            bean.setId(attributes.getValue("id"));
        }
    }

    @Override  //标签结束
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (qName.equals("name")){
            bean.setName(str);
        }else if (qName.equals("author")){
            bean.setAuthor(str);
        }else if (qName.equals("year")){
            bean.setYear(str);
        }else if (qName.equals("price")){
            bean.setPrice(str);
        }

        if ("book".equals(qName)){
            beans.add(bean); ///添加集合
        }
    }

    @Override //类型转换
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        str = new String(ch,start,length); //标签中间的值
    }

    @Override  //结束文档
    public void endDocument() throws SAXException {
        super.endDocument(); //文档结束不做处理
    }

    /**
     * 返回集合
     * @return
     */
    public ArrayList<Bean> getList(){
        return beans;
    }
}

三、Pull

1、定义

解析方式类似于SAX,当元素开始时调用Parse,nextText()

2、用法

四个常量

START_DOCUMENT — 文档开始
END_TAG —结束标签

常用方法

1、getEventType():获得当前事件类型
2、getAttributeValue() :获得该标签属性值
3、next(): 向下移动一个,获得标签类型
4、nextText() : 获得标签中间的值
5、getName(): 获得标签名
6、setImput(文件); 设置解析那个文件

循环条件:不等于结束文档

代码:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值