一、jaxp的sax解析方式的原理(********)
二、使用jaxp的sax方式解析xml(**會寫***)
=======================================
一、jaxp的sax解析方式的原理(********)
* jaxp解析xml有兩種技術 dom 和 sax
* dom方式:根據xml的層級結構在內存中分配一個樹形結構,把xml中標籤,屬性,文本封裝成對象
* sax方式:事件驅動,邊讀邊解析
* 在javax.xml.parsers包裏面
** SAXParser
此類的實例能夠從 SAXParserFactory.newSAXParser() 方法得到
- parse(File f, DefaultHandler dh)
* 兩個參數
** 第一個參數:xml的路徑
** 第二個參數:事件處理器
** SAXParserFactory
實例 newInstance() 方法獲得
* 畫圖分析一下sax執行過程
* 當解析到開始標籤時候,自動執行 startElement 方法.
* 當解析到文本時候,自動執行 characters 方法.
* 當解析到結束標籤時候,自動執行 endElement 方法.
二、使用jaxp的sax方式解析xml(**會寫***)
* sax方式不能實現增刪改操做,只能作查詢操做
** 打印出整個文檔
*** 執行parse方法,第一個參數是xml路徑,第二個參數是事件處理器.
*** 建立一個類,繼承事件處理器的類,重寫裏面的三個方法
需求一:獲取到全部的name元素的值
** 定義一個成員變量 flag= false
** 判斷開始方法是不是name元素,若是是name元素,把flag值設置成true
** 若是flag值是true,在characters方法裏面打印內容
** 當執行到結束方法時候,把flag值設置成false
需求二:獲取第一個name元素的值
** 定義一個成員變量 idx=1
** 在結束方法時候,idx+1 idx++
** 想要打印出第一個name元素的值,
- 在characters方法裏面判斷,
-- 判斷flag=true 而且 idx==1,在打印內容java
public class TestSax { public static void main(String[] args) throws Exception { /* * 一、建立解析器工廠 * 二、建立解析器 * 三、執行parse方法 * * 四、本身建立一個類,繼承DefaultHandler * 五、重寫類裏面的三個方法 * */ //建立解析器工廠 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //建立解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //執行parse方法 saxParser.parse("src/p1.xml", new MyDefault1()); saxParser.parse("src/p1.xml", new MyDefault2()); } } //打印xml的內容 class MyDefault1 extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } } //實現獲取全部的name元素的值 class MyDefault2 extends DefaultHandler { boolean flag = false; int idx = 1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //判斷qName是不是name元素 if("name".equals(qName)) { // flag=true 對應開始標籤 flag = true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { //當flag值是true時候,表示解析到name元素 //索引是1 if(flag == true && idx == 2) { System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //把flag設置成false,表示name元素結束 if("name".equals(qName)) { // flag=false 對應結束標籤 flag = false; idx++; } } }
注:SAX解析原理具體介紹:
DOM方式:一行一行的讀取XML文檔,最終會把XML文檔全部數據存放到Document對象中。
SAX方式:也是一行一行的讀取XML文檔,可是當XML文檔讀取結束後,SAX不會保存任何數據,同時整個解析XML文檔的工做也就結束了。可是,SAX在讀取一行XML文檔數據後,就會給感興趣的用戶一個通知!例如當SAX讀取到一個元素的開始時,會通知用戶當前解析到一個元素的開始標籤。 而用戶能夠在整個解析的過程當中完成本身的業務邏輯,當SAX解析結束,不會保存任何XML文檔的數據。
優先:使用SAX,不會佔用大量內存來保存XML文檔數據,效率也高。
缺點:使用SAX,當解析到一個元素時,上一個元素的信息已經丟棄,也就是說沒有保存元素與元素之間的結構關係,
這也大大限制了SAX的使用範圍。若是隻是想查詢XML文檔中的數據,那麼使用SAX是最佳選擇!
dom