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解析进行封装
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章