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>

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章