標籤: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簡介