XML - StAX示例

襲冷發表於2014-06-30
一、簡介
    StAX 即 Streaming API for XML ,是一種針對XML的流式拉分析API,採用拉(Pull)的方式來處理事件, 允許應用程式從事件流中拉出事件,而不是提供從解析器中接收事件的回撥程式程式。
    StAX 包括兩套處理 XML 的 API,分別提供了不同程度的抽象:
        一種是基於指標的 API, 提供應用程式把 XML 作為一個標記(或事件)流來處理,應用程式可以檢查解析器的狀態,獲得解析的上一個標記的資訊,然後再處理下一個標記,依次類推;
        另一種是較為高階的基於迭代器的 API, 提供應用程式把 XML 作為一系列事件物件來處理,每個物件和應用程式交換 XML 結構的一部分,應用程式直接處理這些代表了XML結構一部分的事件物件。

二、基於指標
    1、獲取XMLStreamReader例項

		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
		XMLStreamReader reader = factory.createXMLStreamReader(is);
    2、讀取節點資訊
		// 迴圈判斷是否還有下文
		while (reader.hasNext()) {
 
			// 判斷節點型別(開始節點、結束或文字)
			int type = reader.next();

			if(type == XMLStreamConstants.START_ELEMENT){

				System.out.println(reader.getName());

			}else if(type == XMLStreamConstants.CHARACTERS){

				System.out.println(reader.getText().trim());

			}else if(type == XMLStreamConstants.END_ELEMENT){

				System.out.println(reader.getName());
			}
 
		}
    3、讀取節點屬性
		while (reader.hasNext()) {

			int type = reader.next();

			if(type == XMLStreamConstants.START_ELEMENT){
				
				String name = reader.getName().toString();
				
				if(name.equals("book")){
					System.out.println("Attribute: "reader.getAttributeName(0) + "-->" + reader.getAttributeValue(0));
				}
			}
		}
    4、基於XMLStreamWriter寫文件
			XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
			
			xsw.writeStartDocument("utf-8","1.1");
			xsw.writeEndDocument();
			xsw.writeStartElement("tns","Book","http://11");
			xsw.writeAttribute("id", "b1");
			xsw.writeStartElement("name");
			xsw.writeCharacters("JavaEE");
			xsw.writeEndElement();
			xsw.writeEndElement();
			
			xsw.flush();
			xsw.close();
三、基於迭代
    1、獲取XMLEventReader例項

		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
		XMLEventReader reader = factory.createXMLEventReader(is);
    2、獲取節點資訊
		// 迴圈判斷是否有下一個
		while (reader.hasNext()) {
			
			// 獲取下一個Event
			XMLEvent event = reader.nextEvent();
			
			//通過XMLEvent來判斷節點型別
			if(event.isStartElement()){
 
				//轉換節點
				String name = event.asStartElement().getName().toString();
				
				if(name.equals("title")){
 
					// 通過reader來獲取節點的文字
					System.out.print("BookName: " + reader.getElementText() ); 
				}	
			}
		}
    3、新增過濾器獲取節點資訊
		XMLInputFactory factory = XMLInputFactory.newInstance();
		InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
		
		XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),
				
				// 新增過濾器
				new EventFilter() {
					@Override
					public boolean accept(XMLEvent event) {
						
						// 只獲取開始節點和文字節點
						if(event.isStartElement() || event.isCharacters()){
							return true;
						}else{
							return false;
						}
					}
				}
			);
				
		while (reader.hasNext()) {
			
			XMLEvent event = reader.nextEvent();
			
			//通過XMLEvent來判斷節點型別
			if(event.isStartElement()){
				
				//轉換節點
				String name = event.asStartElement().getName().toString();
				
				if(name.equals("title")){
					
					//通過reader來獲取節點的文字
					System.out.print(reader.getElementText() + ": "); 
				}
			}
		}

四、附錄

<?xml version="1.0" encoding="utf-8"?>

<bookstore>

	<book category="COOKING">
		<title lang="en">Everyday Italian</title>
		<author>Giada De Laurentiis</author>
		<year>2005</year>
		<price>30.00</price>
	</book>

	<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">XQuery Kick Start</title>
		<author>James McGovern</author>
		<author>Per Bothner</author>
		<author>Kurt Cagle</author>
		<author>James Linn</author>
		<author>Vaidyanathan Nagarajan</author>
		<year>2003</year>
		<price>49.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>

</bookstore>
 
 

 

相關文章