中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

XML中SAX的示例分析

發布時間:2021-09-17 14:45:54 來源:億速云 閱讀:104 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關XML中SAX的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1.SAX解析

  • 在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構建整個DOM樹的Document對象,從而再對XML文檔進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。

  • SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才對文檔進行操作。

  • 通過繼承DefaultHandler,來開發一個SAX解析器

【注意】SAX主要用于對XML文檔的解析,不能去修改、刪除和添加元素。

1.1.SAX解析機制

sax是一種推式的機制,你創建一個sax解析器,解析器在發現xml文檔中的內容時就告訴你(把事件推給你,有點類似于java swing中的事件監聽)。如何處理這些發現的內容,由程序員自己決定。

在基于sax的程序中,有五個最常用的sax事件:

1.startDocument()–>告訴你解析器發現了文檔的開始,告訴你解析器開始掃描文檔
 2.endDocument()–>告訴你解析器發現了文檔結尾
 3.startElement()–>告訴你解析器發現了一個起始標簽,該事件告訴你標簽的名稱、該元素所有的屬性名和值
 4.characters()–>告訴你解析器發現了一些文本,將得到一個字符數組,該數組的偏移量和一個長度偏移量,有這三個變量你可以得到解析器發現的文本
 5.endElement()–>告訴你解析器發現了一個結束標簽,該事件告訴你元素的名稱

1.2.SAX解析實例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班級>
    <學生 地址="香港">
        <名字>周小星</名字>
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>
    <學生 地址="澳門">
        <名字>林曉</名字>
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生></班級>

【步驟】:

1.使用SAXParserFactory創建SAX解析工廠

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通過SAX解析工廠得到解析器對象

SAXParser sp = spf.newSAXParser();

3.將解析對象和事件處理器對象關聯

sp.parse("src/myClass.xml",new MyHandler());

這里的MyHandler需要自己定義,并且它要繼承DefaultHandler,然后在MyHandler類中重寫上文提到的5個sax事件方法,當然也可以只重寫自己需要的。
比如現在我寫的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 發現文檔開始,該函數只會被調用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 發現文檔結束,該函數只會被調用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 發現XML中的一個元素開始,會被反復調用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名稱:"+qName);
    }    /**
     * 發現XML中的一個元素結束,會被反復調用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 發現XML文件中的文本,會被反復調用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 顯示文本內容
        String text = new String(ch,start,length);        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}

運行結果如下:

XML中SAX的示例分析

可以看到,這是對XML文檔的一種遍歷,而sax能夠做的也只是遍歷了。


那么,如果現在我們有這樣一個需求:只顯示所有學生的姓名和年齡,不顯示學生的介紹,怎么實現呢?

我們可以在MyHandler類中定義兩個布爾變量isName和isAge,在startElement方法中標識是否是姓名元素或者年齡元素,如果是的話才在characters方法中獲取對應的文本,如下:

1.定義兩個布爾變量

private boolean isName = false;private boolean isAge = false;

2.在startElement方法中添加判斷

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;
    }else if(qName.equals("年齡")){        this.isAge = true;
    }
}

3.在characters方法中根據標識符進行判斷是否獲取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 顯示文本內容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}

最后要記得將兩個布爾變量復位成false。
運行結果如下:

XML中SAX的示例分析

1.SAX解析

  • 在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構建整個DOM樹的Document對象,從而再對XML文檔進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。

  • SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才對文檔進行操作。

  • 通過繼承DefaultHandler,來開發一個SAX解析器

【注意】SAX主要用于對XML文檔的解析,不能去修改、刪除和添加元素。

1.1.SAX解析機制

sax是一種推式的機制,你創建一個sax解析器,解析器在發現xml文檔中的內容時就告訴你(把事件推給你,有點類似于java swing中的事件監聽)。如何處理這些發現的內容,由程序員自己決定。

在基于sax的程序中,有五個最常用的sax事件:

1.startDocument()–>告訴你解析器發現了文檔的開始,告訴你解析器開始掃描文檔
 2.endDocument()–>告訴你解析器發現了文檔結尾
 3.startElement()–>告訴你解析器發現了一個起始標簽,該事件告訴你標簽的名稱、該元素所有的屬性名和值
 4.characters()–>告訴你解析器發現了一些文本,將得到一個字符數組,該數組的偏移量和一個長度偏移量,有這三個變量你可以得到解析器發現的文本
 5.endElement()–>告訴你解析器發現了一個結束標簽,該事件告訴你元素的名稱

1.2.SAX解析實例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班級>
    <學生 地址="香港">
        <名字>周小星</名字>
        <年齡>23</年齡>
        <介紹>學習刻苦</介紹>
    </學生>
    <學生 地址="澳門">
        <名字>林曉</名字>
        <年齡>25</年齡>
        <介紹>是一個好學生</介紹>
    </學生></班級>

【步驟】:

1.使用SAXParserFactory創建SAX解析工廠

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通過SAX解析工廠得到解析器對象

SAXParser sp = spf.newSAXParser();

3.將解析對象和事件處理器對象關聯

sp.parse("src/myClass.xml",new MyHandler());

這里的MyHandler需要自己定義,并且它要繼承DefaultHandler,然后在MyHandler類中重寫上文提到的5個sax事件方法,當然也可以只重寫自己需要的。
比如現在我寫的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 發現文檔開始,該函數只會被調用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 發現文檔結束,該函數只會被調用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 發現XML中的一個元素開始,會被反復調用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名稱:"+qName);
    }    /**
     * 發現XML中的一個元素結束,會被反復調用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 發現XML文件中的文本,會被反復調用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 顯示文本內容
        String text = new String(ch,start,length);        
        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}

運行結果如下:

XML中SAX的示例分析

可以看到,這是對XML文檔的一種遍歷,而sax能夠做的也只是遍歷了。


那么,如果現在我們有這樣一個需求:只顯示所有學生的姓名和年齡,不顯示學生的介紹,怎么實現呢?

我們可以在MyHandler類中定義兩個布爾變量isName和isAge,在startElement方法中標識是否是姓名元素或者年齡元素,如果是的話才在characters方法中獲取對應的文本,如下:

1.定義兩個布爾變量

private boolean isName = false;private boolean isAge = false;

2.在startElement方法中添加判斷

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        
        this.isName = true;
    }else if(qName.equals("年齡")){        this.isAge = true;
    }
}

3.在characters方法中根據標識符進行判斷是否獲取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 顯示文本內容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}

最后要記得將兩個布爾變量復位成false。
運行結果如下:

XML中SAX的示例分析

感謝各位的閱讀!關于“XML中SAX的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙泉市| 襄城县| 平泉县| 龙门县| 康定县| 定远县| 中卫市| 乐昌市| 大化| 宝山区| 泸西县| 开鲁县| 高要市| 八宿县| 台北县| 磐石市| 将乐县| 白山市| 潞城市| 桃园市| 库车县| 定结县| 赤水市| 金乡县| 商城县| 盘山县| 通州区| 福泉市| 丰城市| 连山| 登封市| 偏关县| 万宁市| 宜丰县| 福贡县| 阳山县| 乳源| 孝义市| 泾阳县| 集安市| 余干县|