XML解析--Stax

XML解析–Stax

  • Streaming API for XML
    – 流模型中的拉模型 (Pull)
    – 在遍歷文檔時,會把感興趣的部分從讀取器中拉出,不需要引發事件,允許我們選擇性地處理節點。這大大提高了靈活性,以及整體效率。
    – 兩套處理API
    - 基於指針的API,XMLStreamReader
    - 基於迭代器的API,XMLEventReader

XML解析–Stax實例

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>
package com.torey.javaAdvanced.mooc4.stax;

import javax.xml.stream.*;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

/**
 * @ClassName:StaxReader
 * @Description:189
 * @author: Torey
 */
public class StaxReader {
    public static void main(String[] args) throws XMLStreamException {
        System.out.println("基於指針");
        readByStream();
        System.out.println("基於迭代器");
        readByEvent();
    }
    //流模式-基於指針API
    public static void readByStream() throws XMLStreamException {
        String xmlFile="books.xml";
        XMLInputFactory factory = XMLInputFactory.newFactory();
        XMLStreamReader streamReader=null;
        try {
            streamReader = factory.createXMLStreamReader(new FileReader(xmlFile));
        } catch (XMLStreamException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //基於指針遍歷
        while (streamReader.hasNext()) {
            int event = streamReader.next();
            //如果是元素的開始
            if (event==XMLStreamConstants.START_ELEMENT) {
                //列出所有書籍名稱
                if ("title".equalsIgnoreCase(streamReader.getLocalName())) {
                    System.out.println("title:" + streamReader.getElementText());
                }
            }
        }
        streamReader.close();
    }
    //基於迭代器的API
    public static void readByEvent(){
        String xmlFile="books.xml";
        XMLInputFactory factory = XMLInputFactory.newInstance();
        boolean titleFlag=false;
        try {
            //創建基於迭代器的事件讀取器對象
            XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(xmlFile));
            //遍歷Event迭代器
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                //如果事件對象是元素的開始
                if (event.isStartElement()) {
                    //轉換成開始元素事件對象
                    StartElement start = event.asStartElement();
                    // 打印元素標籤的本地名稱
                    String name = start.getName().getLocalPart();
                    if (name.equals("title")) {
                        titleFlag=true;
                        System.out.println("title:");
                    }
                    //取得所有屬性
                    Iterator attrs = start.getAttributes();
                    while (attrs.hasNext()) {
                        Attribute attr= (Attribute)attrs.next();
                    }
                }
                //如果是正文
                if (event.isCharacters()) {
                    String s = event.asCharacters().getData();
                    if (s!=null&&s.trim().length()>0&&titleFlag) {
                        System.out.println(s.trim());
                    }
                }
                //如果事件對象是元素的結束
                if (event.isEndElement()) {
                    EndElement end = event.asEndElement();
                    String name = end.getName().getLocalPart();
                    if (name.equals("title")) {
                        titleFlag=false;
                    }
                }
            }
            eventReader.close();
        }catch (Exception ex){

        }
    }
}

其他的第三方庫

  • DOM/SAX/Stax是JDK自帶的解析功能
  • 第三方庫
    – JDOM:www.jdom.org
    – DOM4J: dom4j.github.io
  • 第三方庫一般都包含DOM,SAX等多個方式解析,是對Java解析進行封裝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章