通過(guò)SAXParseFactory的靜態(tài)newInstance()方法獲取SAXParserFactory實(shí)例factory 通過(guò)SAXParserFactory實(shí)例的newSAXParser()方法返回SAXParser實(shí)例parser 創(chuàng)建一個(gè)類(lèi)繼承DefaultHandle,重寫(xiě)方法進(jìn)行業(yè)務(wù)處理并創(chuàng)建這個(gè)類(lèi)的實(shí)例handle
重寫(xiě)DefaultHandle類(lèi)的方法startElement方法用來(lái)遍歷xml文件的開(kāi)始標(biāo)簽;
endElement方法用來(lái)遍歷xml文件的結(jié)束標(biāo)簽;
startDocument方法用來(lái)標(biāo)識(shí)解析開(kāi)始;
endDocument方法用來(lái)標(biāo)識(shí)解析結(jié)束。
characters方法用來(lái)獲取text
其中:參數(shù)qName 遍歷到的元素的名稱(chēng)
且同樣會(huì)出現(xiàn)空白和換行的問(wèn)題
下面直接上代碼
<?xml version="1.0" encoding="UTF-8"?><bookstore> <book id="1"> <name>JAVA編程思想</name> <anthor>****</anthor> <year>2000</year> </book> <book id="2"> <name>瘋狂JAVA系列</name> <anthor>李剛</anthor> <PRice>89</price> </book></bookstore>books.xml
SAX.java
package pers.zww.xml.handler;import javax.xml.stream.events.StartElement;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXParserHandler extends DefaultHandler{ int bookIndex=0; /* * 解析XML元素 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //開(kāi)始解析book元素的屬性 if (qName.equals("book")) { bookIndex++; System.out.println("開(kāi)始遍歷第"+bookIndex+"本書(shū)"); // //已知book元素下的屬性名稱(chēng),根據(jù)屬性名稱(chēng)獲取屬性值// String value=attributes.getValue("id");// System.out.println("book的屬性值:"+value); //未知book元素下的屬性名稱(chēng)及個(gè)數(shù) int num=attributes.getLength(); for (int i = 0; i < num; i++) { System.out.print("book元素的第"+(i+1)+"個(gè)屬性名:"+attributes.getQName(i)); System.out.println(" && 屬性值:"+attributes.getValue(i)); } }else if(!qName.equals("book")&&!qName.equals("bookstore")){ System.out.print("節(jié)點(diǎn)名:"+qName); }else { } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); String val=new String(ch, start, length); if (!val.trim().equals("")) { System.out.println(" && 節(jié)點(diǎn)值:"+val); } } /* * 用來(lái)遍歷xml文件的結(jié)束標(biāo)簽 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); //是否針對(duì)一本書(shū)已經(jīng)遍歷結(jié)束 if (qName.equals("book")) { System.out.println("======================="); } } /* * 用來(lái)標(biāo)志解析開(kāi)始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); //第一行開(kāi)始 System.out.println("SAX解析開(kāi)始"); } /* * 用來(lái)標(biāo)志解析結(jié)束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); //最后一行結(jié)束 System.out.println("SAX解析結(jié)束"); }}SAXParserHandler.javaSAX與DOM對(duì)比DOM解析原理:先把XML文件整個(gè)加載到內(nèi)存中,在逐個(gè)解析;
SAX解析原理:通過(guò)自己創(chuàng)建的Handler類(lèi),去逐個(gè)分析遇到的每一個(gè)節(jié)點(diǎn);(節(jié)點(diǎn)分析是從最外層向里層逐個(gè)開(kāi)始).
參考資料慕課網(wǎng)JessicaJiang老師視頻教程 鏈接:http://www.imooc.com/video/3789
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注