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>

運行結果如下:
在這裏插入圖片描述

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