您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關XML中SAX的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構建整個DOM樹的Document對象,從而再對XML文檔進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。
SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才對文檔進行操作。
通過繼承DefaultHandler
,來開發一個SAX解析器
【注意】SAX主要用于對XML文檔的解析,不能去修改、刪除和添加元素。
sax是一種推式的機制,你創建一個sax解析器,解析器在發現xml文檔中的內容時就告訴你(把事件推給你,有點類似于java swing中的事件監聽)。如何處理這些發現的內容,由程序員自己決定。
在基于sax的程序中,有五個最常用的sax事件:
1.startDocument()–>告訴你解析器發現了文檔的開始,告訴你解析器開始掃描文檔
2.endDocument()–>告訴你解析器發現了文檔結尾
3.startElement()–>告訴你解析器發現了一個起始標簽,該事件告訴你標簽的名稱、該元素所有的屬性名和值
4.characters()–>告訴你解析器發現了一些文本,將得到一個字符數組,該數組的偏移量和一個長度偏移量,有這三個變量你可以得到解析器發現的文本
5.endElement()–>告訴你解析器發現了一個結束標簽,該事件告訴你元素的名稱
依然使用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能夠做的也只是遍歷了。
那么,如果現在我們有這樣一個需求:只顯示所有學生的姓名和年齡,不顯示學生的介紹,怎么實現呢?
我們可以在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。
運行結果如下:
在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構建整個DOM樹的Document對象,從而再對XML文檔進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。
SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才對文檔進行操作。
通過繼承DefaultHandler
,來開發一個SAX解析器
【注意】SAX主要用于對XML文檔的解析,不能去修改、刪除和添加元素。
sax是一種推式的機制,你創建一個sax解析器,解析器在發現xml文檔中的內容時就告訴你(把事件推給你,有點類似于java swing中的事件監聽)。如何處理這些發現的內容,由程序員自己決定。
在基于sax的程序中,有五個最常用的sax事件:
1.startDocument()–>告訴你解析器發現了文檔的開始,告訴你解析器開始掃描文檔
2.endDocument()–>告訴你解析器發現了文檔結尾
3.startElement()–>告訴你解析器發現了一個起始標簽,該事件告訴你標簽的名稱、該元素所有的屬性名和值
4.characters()–>告訴你解析器發現了一些文本,將得到一個字符數組,該數組的偏移量和一個長度偏移量,有這三個變量你可以得到解析器發現的文本
5.endElement()–>告訴你解析器發現了一個結束標簽,該事件告訴你元素的名稱
依然使用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能夠做的也只是遍歷了。
那么,如果現在我們有這樣一個需求:只顯示所有學生的姓名和年齡,不顯示學生的介紹,怎么實現呢?
我們可以在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的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。