jaxp解析器——sax

   上篇對採用jaxp解析器使用dom技術解析xml做了一個介紹,對jaxp解析器使用sax技術解析xml則一筆帶過了,接下來我們看看jaxp採用sax技術是如何解析xml的呢。

   採用sax技術解析xml是依靠於事件驅動的,邊讀邊解析,相關類位於javax.xml.parsers包裏面

           **SAXParser    此類的實例可以從SAXParserFactory的newSAXParser( )方法獲得

                     |_ Parser( File f , DefaultHandler dh )   兩個參數   *第一個參數:xml的路徑    *第二個參數:事件處理器

           **SAXParserFactory     其實例可以通過本身的newInstance()方法得到

   **SAX執行過程

            |- 當解析到開始標籤的時,自動執行startElement()方法

            |- 當解析到文本的時,自動執行characters()方法

            |_ 當解析到結束標籤時,自動執行endElement()方法


   **使用jaxp的sax方式來解析xml

            *sax方式不能實現增刪改操作,只能做查詢操作

            *打印整個xml文檔

                   執行parse()方法,第一個參數是xml路徑,第二個參數是事件處理器

                           **創建一個類,繼承事件處理器的類

                           **重寫裏面的三個方法

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、創建解析器工廠
         * 2、根據工廠得到解析器
         * 3、調用解析器的parse方法
         * 4、創建繼承事件處理器的類
         */
        //1、創建解析器工廠
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根據工廠得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、調用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler());
    }
}
class MyHandler 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的值

                           **定義一個成員變量flag=false

                           **判斷開始方法是否是name元素,如果是name元素,把flag設置爲true

                           **如果flag值爲true,在character()方法裏面打印內容

                           **當執行到結束方法時,把flag值設置成false

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、創建解析器工廠
         * 2、根據工廠得到解析器
         * 3、調用解析器的parse方法
         * 4、創建繼承事件處理器的類
         */
        //1、創建解析器工廠
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根據工廠得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、調用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler1());
    }
}
class MyHandler1 extends DefaultHandler{
    boolean flag=false;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if("name".equals(qName)){
            flag=true;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(flag==true){
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("name".equals(qName)){
            flag=false;
        }
    }
}

            *獲取到第一個name的值

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、創建解析器工廠
         * 2、根據工廠得到解析器
         * 3、調用解析器的parse方法
         * 4、創建繼承事件處理器的類
         */
        //1、創建解析器工廠
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根據工廠得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、調用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler1());
    }
}
class MyHandler1 extends DefaultHandler{
    boolean flag=false;
    int idx=1;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if("name".equals(qName)&&idx==1){
            flag=true;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(flag==true){
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("name".equals(qName)){
            flag=false;
            idx++;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章