首先是我們用到的位於src下面的books.xml
<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="COOKING" aaaaaa="111111"><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>
下面是Stax用法
package com.jadyer.stax;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.stream.EventFilter;import javax.xml.stream.FactoryConfigurationError;import javax.xml.stream.XMLEventReader;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLOutputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader;import javax.xml.stream.XMLStreamWriter;import javax.xml.stream.events.XMLEvent;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.TransformerFactoryConfigurationError;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import javax.xml.xpath.XPath;import javax.xml.xpath.XPathConstants;import javax.xml.xpath.XPathFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;/** * 使用Stax解析XML * @see Stax(Streaming API for XML) * @create Mar 17, 2013 5:30:31 PM * @author 玄玉<http://blog.csdn/net/jadyer> */public class TestStax {public static void main(String[] args) throws Exception {cursorParseXML();iteratorParseXML();filterParseXML();xpathParseXML();xmlStreamWriterXML();transformerModifyXML();}/** * 基於游標的方式解析XML */private static void cursorParseXML() throws Exception {XMLInputFactory factory = XMLInputFactory.newInstance();InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");XMLStreamReader reader = factory.createXMLStreamReader(is);while(reader.hasNext()) {int type = reader.next();//處理不同的節點類型//處理開始節點,如<bookstore>,<book>if(type == XMLStreamConstants.START_ELEMENT) {String name = reader.getName().toString();System.out.println("<" + name + ">");//列印<book category="COOKING" aaaaaa="111111">節點中的第二個屬性值aaaaaaif(name.equals("book")){System.out.println("節點屬性值為" + reader.getAttributeName(1) + "=" + reader.getAttributeValue(1));}if(name.equals("title")) {System.out.println("書籍[" + reader.getElementText() + "]");}if(name.equals("price")) {System.out.println("的價格為[" + reader.getElementText() + "]");}//列印文本節點的內容,注意各xml標籤中的空白部分也屬於文本節點..並且文本節點是沒有name的,所以不能getName} else if(type == XMLStreamConstants.CHARACTERS) {System.out.println("文本節點值=[" + reader.getText().trim() + "]");//處理結束節點,如</book>,</title>} else if(type == XMLStreamConstants.END_ELEMENT) {System.out.println("</" + reader.getName() + ">");}}//最後處理完了xml,記得關閉..但不能提前關閉,因為Stax是讀一點流就解析一點的is.close();}/** * 基於迭代模型的方式解析XML */private static void iteratorParseXML() throws Exception {XMLInputFactory factory = XMLInputFactory.newInstance();InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");XMLEventReader reader = factory.createXMLEventReader(is);int iteratorNum = 0; //統計遍曆的次數while(reader.hasNext()) {XMLEvent event = reader.nextEvent();if(event.isStartElement()) { //通過XMLEvent判斷節點類型String name = event.asStartElement().getName().toString(); //通過event.asxxx轉換節點if(name.equals("title")) {System.out.print("書籍[" + reader.getElementText() + "]");}if(name.equals("price")) {System.out.println("的價格為[" + reader.getElementText() + "]");}}iteratorNum++;}is.close();System.out.println("本次操作遍曆XML的次數合計為[" + iteratorNum + "]次");}/** * 基於Filter的方式解析XML * @see 可以有效過濾掉不用進行操作的節點,效率會高一些 */private static void filterParseXML() throws Exception {XMLInputFactory factory = XMLInputFactory.newInstance();InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),new EventFilter() {@Overridepublic boolean accept(XMLEvent event) {if(event.isStartElement()) {String name = event.asStartElement().getName().toString();if(name.equals("title") || name.equals("price")){return true; //返回true表示會顯示,false表示不顯示}}return false;}});int iteratorNum = 0; //統計遍曆的次數while(reader.hasNext()) {XMLEvent event = reader.nextEvent();if(event.isStartElement()) {String name = event.asStartElement().getName().toString();if(name.equals("title")) {System.out.print("書籍[" + reader.getElementText() + "]");}if(name.equals("price")) {System.out.println("的價格為[" + reader.getElementText() + "]");}}iteratorNum++;}is.close();System.out.println("本次操作遍曆XML的次數合計為[" + iteratorNum + "]次");}/** * 基於XPath的方式解析XML */private static void xpathParseXML() throws Exception {InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");//建立文檔處理對象DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();//通過DocumentBuilder建立doc的文檔對象Document doc = db.parse(is);//建立XPathXPath xpath = XPathFactory.newInstance().newXPath();//第一個參數就是XPath運算式,第二參數就是文檔..這裡是尋找所有屬性為category="WEB"的<book>節點NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']", doc, XPathConstants.NODESET);for(int i=0; i<list.getLength(); i++) {Element e = (Element)list.item(i);//由於<book>節點下只會有一個<title>節點,所有這裡是item(0)System.out.println(e.getElementsByTagName("title").item(0).getTextContent());System.out.println(e.getElementsByTagName("price").item(0).getTextContent());}is.close();}/** * 使用XMLStreamWriter建立XML */private static void xmlStreamWriterXML() throws XMLStreamException, FactoryConfigurationError {XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);xsw.writeStartDocument("GBK","1.0");xsw.writeEndDocument(); //先寫<?xml version="1.0" encoding="GBK"?>String namespaceURI = "http://blog.csdn.net/jadyer";xsw.writeStartElement("pre", "uesr", namespaceURI); //再寫<pre:uesr>xsw.writeStartElement(namespaceURI, "id"); //再寫<pre:id>xsw.writeCharacters("1"); //再寫1xsw.writeEndElement(); //再寫</pre:id>xsw.writeEndElement(); //再寫</pre:uesr>xsw.flush();xsw.close();}/** * 使用Transformer更新XML */private static void transformerModifyXML() throws Exception, TransformerFactoryConfigurationError {InputStream is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();Document doc = db.parse(is);XPath xpath = XPathFactory.newInstance().newXPath();//尋找內容含title="Learning XML"的<book>節點NodeList list = (NodeList)xpath.evaluate("//book[title='Learning XML']", doc, XPathConstants.NODESET);//擷取<price>節點,這裡只有一個合格<book>節點,所以寫成了list.item(0)Element e = (Element)(((Element)list.item(0)).getElementsByTagName("price").item(0));e.setTextContent("333.9");Transformer tran = TransformerFactory.newInstance().newTransformer();tran.setOutputProperty(OutputKeys.ENCODING, "UTF-8");tran.setOutputProperty(OutputKeys.INDENT, "yes"); //讓<?xml version=...?>與<bookestore>節點之間換行,預設不換行//修改節點tran.transform(new DOMSource(doc), new StreamResult(System.out));is.close();}}