XML解析--SAX

XML解析–SAX

  • Simple API for XML
    • 流模型中的推模型(Push)
    • 采用事件/流模型来解析XML文档,更快速、更轻量
    • 有选择的解析和访问,不像DOM加载整个文档,内存要求较低
    • SAX对XML文档的解析为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据。
    • 推模型。当它每发现一个节点就引发一个事件,而我们需要编写这些事件的处理程序。关键类:DefaultHandler

SAX的五个回调方法:

  1. startDocument 文档开始解析;
  2. endDocument 文档结束解析
  3. startElement 开始访问元素
  4. endElement 结束访问元素
  5. characters 访问元素正文。

SAX–代码实例:

SAXReader .java

package com.torey.javaAdvanced.mooc4.sax;

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

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName:SAXReader
 * @Description:
 * @author: Torey
 */
public class SAXReader {
    public static void main(String[] args) throws SAXException, IOException {
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        BookHandler bookHandler = new BookHandler();
        xmlReader.setContentHandler(bookHandler);
        xmlReader.parse("books.xml");
        System.out.println(bookHandler.getNameList());

    }
}
class BookHandler extends DefaultHandler{
    private List<String> nameList;
    private Boolean title=false;
    public List<String> getNameList(){
        return nameList;
    }
    //xml文档加载时
    @Override
    public void startDocument ()throws SAXException
    {
        System.out.println("Start parsing document...");
        nameList=new ArrayList<>();
    }
    //文档解析结束
    @Override
    public void endDocument ()throws SAXException
    {
        System.out.println("End");
    }
    //访问某一个元素
    @Override
    public void startElement (String uri, String localName,
                              String qName, Attributes attributes)
            throws SAXException
    {
        if (qName.equals("title")) {
            title=true;
        }
    }
    //结束访问元素
    @Override
    public void endElement (String uri, String localName, String qName)
            throws SAXException
    {
        if (title) {
            title=false;
        }
    }
    //访问元素正文
    @Override
    public void characters (char ch[], int start, int length)
            throws SAXException
    {
        if (title) {
            String bookTitle= new String(ch,start,length);
            System.out.println("Book title:" + bookTitle);
            nameList.add(bookTitle);
        }
    }
}

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
    <book category="JS">
        <title lang="en">java script从入门到放弃</title>
        <author>torey</author>
        <year>2018</year>
        <price>39.95</price>
    </book>
</bookstore>

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值