這篇文章主要為大家展示了“XML編程中SAX的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“XML編程中SAX的示例分析”這篇文章吧。
成都創(chuàng)新互聯(lián)主營(yíng)泰山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開(kāi)發(fā),泰山h5微信小程序開(kāi)發(fā)搭建,泰山網(wǎng)站營(yíng)銷(xiāo)推廣歡迎泰山等地區(qū)企業(yè)咨詢(xún)SAX,全稱(chēng)Simple API for XML,既是一種接口,也是一種軟件包。它是一種XML解析的替代方法。SAX不同于DOM解析,它逐行掃描文檔,一邊掃描一邊解析。由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,這對(duì)于大型文檔的解析是個(gè)巨大優(yōu)勢(shì)。
SAX是一個(gè)用于處理XML事件驅(qū)動(dòng)的“推”模型,雖然它不是W3C標(biāo)準(zhǔn),但它卻是一個(gè)得到了廣泛認(rèn)可的API。SAX解析器不像DOM那樣建立一個(gè)完整的文檔樹(shù),而是在讀取文檔時(shí)激活一系列事件,這些事件被推給事件處理器,然后由事件處理器提供對(duì)文檔內(nèi)容的訪問(wèn)。
PS:SAX不能夠?qū)ML文件進(jìn)行修改,刪除、添加操作。
DOM技術(shù)也是一種非常好的DOM解析方案,為什么還會(huì)出現(xiàn)SAX技術(shù)呢?原因很簡(jiǎn)單,那就是DOM是以文檔樹(shù)的結(jié)構(gòu)對(duì)XML進(jìn)行保存,這就表明是一次性將XML讀入內(nèi)存,那么這在大型的XML文件中是不可能的。所以才產(chǎn)生了SAX這種掃描解析的技術(shù)。
SAX解析允許在讀取文檔的時(shí)候,即對(duì)文檔進(jìn)行處理,而不必等到整個(gè)文檔裝載完才會(huì)文檔進(jìn)行操作。
在Java中,通過(guò)繼承DefaultHandler 接口,可以開(kāi)發(fā)一個(gè)SAX解析器。
SAX的解析機(jī)制和事件監(jiān)聽(tīng)機(jī)制很像,都是等待某一事件觸發(fā),然后調(diào)用相應(yīng)方法。
SAX解析器的最常用5個(gè)事件:
1、startDocument():這標(biāo)識(shí)著SAX解析器掃描到文檔開(kāi)始位置。
2、endDocument(),這標(biāo)識(shí)著SAX解析器掃描到文檔的結(jié)束位置。
3、startElement(),這標(biāo)識(shí)著SAX解析器掃描到一個(gè)元素的開(kāi)始標(biāo)簽。
4、character(),這標(biāo)識(shí)著SAX解析器掃描到了一些文本,注意它是以char數(shù)組形式存放的。
5、endElement(),這標(biāo)識(shí)著SAX解析器掃描到了一個(gè)元素的結(jié)束標(biāo)簽。
public void startDocument()
public void startElement(String uri, String localName, String qName,Attributes attributes)
uri - 名稱(chēng)空間 URI,如果元素沒(méi)有任何名稱(chēng)空間 URI,或者沒(méi)有正在執(zhí)行名稱(chēng)空間處理,則為空字符串。
localName - 本地名稱(chēng)(不帶前綴),如果沒(méi)有正在執(zhí)行名稱(chēng)空間處理,則為空字符串。
qName - 限定的名稱(chēng)(帶有前綴),如果限定的名稱(chēng)不可用,則為空字符串。
attributes - 附加到元素的屬性。如果沒(méi)有屬性,則它將是空的 Attributes 對(duì)象。
public void characters(char[] ch, int start, int length)
ch - 文檔的所有字符。
start - 字符數(shù)組中的開(kāi)始位置。
length - 從字符數(shù)組中使用的字符數(shù)。
public void endElement(String uri, String localName, String qName)
uri - 名稱(chēng)空間 URI,如果元素沒(méi)有任何名稱(chēng)空間 URI,或者沒(méi)有正在執(zhí)行名稱(chēng)空間處理,則為空字符串。
localName - 本地名稱(chēng)(不帶前綴),如果沒(méi)有正在執(zhí)行名稱(chēng)空間處理,則為空字符串。
qName - 限定的名稱(chēng)(帶有前綴),如果限定的名稱(chēng)不可用,則為空字符串。
public void endDocument()
通過(guò)解析器和事件處理器一起使用,可以解析XML文檔。解析器可以使用JAXP的API創(chuàng)建,創(chuàng)建出SAX解析器后,就可以指定解析器去解析某個(gè)XML文檔。事件處理器由程序員編寫(xiě),程序員通過(guò)事件處理器中方法的參數(shù),就可以很輕松地得到sax解析器解析到的數(shù)據(jù),從而可以決定如何對(duì)數(shù)據(jù)進(jìn)行處理。
解析步驟
1、通過(guò)調(diào)用SAXParserFactory的newInstance()方法獲得Sax解析器工廠對(duì)象。
2、通過(guò)Sax解析器工廠對(duì)象調(diào)用newSAXParser()方法獲得解析器SAXParser對(duì)象
3、通過(guò)調(diào)用解析器對(duì)象的parse方法將解析器與事件處理器對(duì)象關(guān)聯(lián)
案例:
XML6.xml
<班級(jí) 班次="1班" 編號(hào)="C1"> <學(xué)生 地址="湖南" 學(xué)號(hào)="n1" 性別="男" 授課方式="面授" 朋友="n2" 班級(jí)編號(hào)="C1"> <名字>張三名字> <年齡>20年齡> <介紹>不錯(cuò)介紹> 學(xué)生> <學(xué)生 學(xué)號(hào)="n2" 性別="女" 授課方式="面授" 朋友="n1 n3" 班級(jí)編號(hào)="C1"> <名字>李四名字> <年齡>18年齡> <介紹>很好介紹> 學(xué)生> <學(xué)生 學(xué)號(hào)="n3" 性別="男" 授課方式="面授" 朋友="n2" 班級(jí)編號(hào)="C1"> <名字>王五名字> <年齡>22年齡> <介紹>非常好介紹> 學(xué)生> <學(xué)生 性別="男"> <名字>小明名字> <年齡>30年齡> <介紹>好介紹> 學(xué)生> 班級(jí)>
package com.pc; import javax.xml.parsers.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XML6{ //使用sax技術(shù)去解析xml文件 public static void main(String[] args) throws Exception, SAXException { // TODO Auto-generated method stub //1.創(chuàng)建SaxParserFactory SAXParserFactory spf=SAXParserFactory.newInstance(); //2.創(chuàng)建SaxParser 解析器 SAXParser saxParser=spf.newSAXParser(); //3 把xml文件和事件處理對(duì)象關(guān)聯(lián) saxParser.parse("src/com/pc/XML6.xml",new MyDefaultHandler2() ); } } // 只顯示學(xué)生的名字和年齡 class MyDefaultHandler2 extends DefaultHandler{ private boolean isName=false; private boolean isAge=false; @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub String con=new String(ch,start,length); if(!con.trim().equals("")&&(isName||isAge)){ System.out.println(con); } isName=false; isAge=false; //super.characters(ch, start, length); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } @Override public void endElement(String uri, String localName, String name) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, name); } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // TODO Auto-generated method stub if(name.equals("名字")){ this.isName=true; }else if(name.equals("年齡")){ this.isAge=true; } } } //定義事件處理類(lèi) class MyDefaultHandler1 extends DefaultHandler{ //發(fā)現(xiàn)文檔開(kāi)始 @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("startDocument()"); super.startDocument(); } //發(fā)現(xiàn)xml文件中的一個(gè)元素 @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // TODO Auto-generated method stub System.out.println("元素名稱(chēng)="+name); } //發(fā)現(xiàn)xml文件中的文本 @Override public void characters(char[] ch, int start, int length) throws SAXException { String con=new String(ch,start,length); //顯示文本內(nèi)容: if(!con.trim().equals("")){ System.out.println(new String(ch,start,length)); } } //發(fā)現(xiàn)xml文件中一個(gè)元素介紹 @Override public void endElement(String uri, String localName, String name) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, name); } //發(fā)現(xiàn)文檔結(jié)束 @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("endDocument()"); super.endDocument(); } }
以上是“XML編程中SAX的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。