Jaxp解析器_SAX解析方式

一、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

相關文章
相關標籤/搜索