Java Stax操作XML簡介

來源:互聯網
上載者:User

標籤:java   stax   xml   解析   

使用stax操作xml 非常的簡單,它的讀取過程像是一個游標在移動。針對不同的節點做不同的處理。
先看一個基於游標的模型處理xml:

public class StaxTest {    @Test    public void test1() {        try {            // 1.構建XMLStreamReader            XMLInputFactory factory = XMLInputFactory.newInstance();            XMLStreamReader reader = factory                    .createXMLStreamReader(StaxTest.class                            .getResourceAsStream("books.xml"));            while (reader.hasNext()) {                int type = reader.next();                //是否是開始節點,開始節點就是<>                if(type==XMLStreamReader.START_ELEMENT){                    System.out.println("<"+reader.getName()+">");                    //是否是文本節點,開始節點和結束節點之間的內容                }else if(type==XMLStreamReader.CHARACTERS){                    System.out.println(reader.getText());                    //是否是結束節點,結束節點就是</>                }else if(type==XMLStreamReader.END_ELEMENT){                    System.out.println("</"+reader.getName()+">");                }            }        } catch (FactoryConfigurationError | XMLStreamException e) {            e.printStackTrace();        }    }    @Test    public void test2() {        try {            // 1.構建XMLStreamReader            XMLInputFactory factory = XMLInputFactory.newInstance();            XMLStreamReader reader = factory                    .createXMLStreamReader(StaxTest.class                            .getResourceAsStream("books.xml"));            while (reader.hasNext()) {                int type = reader.next();                //輸出所有book節點的屬性,0表示是第幾個參數                if(type==XMLStreamReader.START_ELEMENT){                    if (reader.getName().toString().equals("book")) {                        System.out.println(reader.getAttributeName(0) + ":"                                + reader.getAttributeValue(0));                    }                }            }        } catch (FactoryConfigurationError | XMLStreamException e) {            e.printStackTrace();        }    }    @Test    public void test3() {        try {            // 1.構建XMLStreamReader            XMLInputFactory factory = XMLInputFactory.newInstance();            XMLStreamReader reader = factory                    .createXMLStreamReader(StaxTest.class                            .getResourceAsStream("books.xml"));            while (reader.hasNext()) {                int type = reader.next();                //輸出每本書的名稱和價格,                if(type==XMLStreamReader.START_ELEMENT){                    if (reader.getName().toString().equals("name")) {                        System.out.print(reader.getName()+":"+reader.getElementText());                    }                    if (reader.getName().toString().equals("price")) {                        System.out.println(reader.getName()+":"+reader.getElementText());                    }                }            }        } catch (FactoryConfigurationError | XMLStreamException e) {            e.printStackTrace();        }    }}
<books>    <book category="編程技術" edition="8">        <id>1</id>        <name>Java編程思想</name>        <price>80</price>        <author>張三</author>        <detail>             <pressTime>天朝</pressTime>             <storyTime>21世紀</storyTime>        </detail>    </book>    <book category="曆史小說" edition="1">        <id>2</id>        <name>三國演義</name>        <price>30</price>        <author>羅貫中</author>        <detail>             <pressTime>明朝</pressTime>             <storyTime>漢末</storyTime>        </detail>    </book>    <book category="小說" edition="2">        <id>3</id>        <name>紅樓夢</name>        <price>35</price>        <author>曹雪芹</author>        <detail>             <pressTime>清朝</pressTime>             <storyTime>不詳</storyTime>        </detail>    </book>    <book category="神話小說" edition="4">        <id>4</id>        <name>西遊記</name>        <price>25</price>        <author>吳承恩</author>        <detail>             <pressTime>明朝</pressTime>             <storyTime>大唐</storyTime>        </detail>    </book>    <book category="小說" edition="5">        <id>5</id>        <name>水滸傳</name>        <price>30</price>        <author>施耐庵</author>        <detail>             <pressTime>明朝</pressTime>             <storyTime>大宋</storyTime>        </detail>    </book></books>

還有一種處理方式是基於迭代模型的處理方式,基於迭代模型與基於游標模型非常相似,看代碼:

    @Test    public void test4(){        try {            XMLInputFactory factory = XMLInputFactory.newInstance();            XMLEventReader reader = factory.createXMLEventReader(StaxTest.class.getResourceAsStream("books.xml"));            while(reader.hasNext()){                XMLEvent event = reader.nextEvent();                if(event.isStartElement()){                    System.out.println("<"+event.asStartElement().getName()+">");                }else if(event.isCharacters()){                    System.out.println(event.asCharacters().getData());                }else if(event.isEndElement()){                    System.out.println("</"+event.asEndElement().getName()+">");                }            }        } catch (FactoryConfigurationError | XMLStreamException e) {            e.printStackTrace();        }    }

這一段代碼輸出結果與test1()輸出結果完全相同,基於迭代模型就是要先將event.as****,然後操作與基於游標模型完全相同。

再看看給迭代模型添加過濾器,

    @Test    public void test5() {        try {            XMLInputFactory factory = XMLInputFactory.newInstance();            XMLEventReader reader = factory.createFilteredReader(factory                    .createXMLEventReader(StaxTest.class                            .getResourceAsStream("books.xml")), (event) -> {                                if(event.isStartElement()) return true;                return false;            });            while(reader.hasNext()){                XMLEvent event = reader.nextEvent();                System.out.println(event.asStartElement().getName());            }        } catch (FactoryConfigurationError | XMLStreamException e) {            e.printStackTrace();        }    }

上面這一段給迭代模型添加了一個過濾器,這裡是用到了jdk8的最新特性lambda運算式來簡化了操作,過濾器返回所有的開始節點。

Java Stax操作XML簡介

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.