亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中使用jaxp進行sax解析_動力節(jié)點Java學院整理

 更新時間:2017年08月02日 10:40:31   投稿:mrr  
使用SAX的優(yōu)勢在于其解析速度較快,相對于DOM而言占用內存較少。這篇文章主要介紹了Java中使用jaxp進行sax解析,需要的朋友可以參考下

SAX解析XML文件采用事件驅動的方式進行,也就是說,SAX是逐行掃描文件,遇到符合條件的設定條件后就會觸發(fā)特定的事件,回調你寫好的事件處理程序。使用SAX的優(yōu)勢在于其解析速度較快,相對于DOM而言占用內存較少。而且SAX在解析文件的過程中得到自己需要的信息后可以隨時終止解析,并不一定要等文件全部解析完畢。凡事有利必有弊,其劣勢在于SAX采用的是流式處理方式,當遇到某個標簽的時候,它并不會記錄下以前所遇到的標簽,也就是說,在處理某個標簽的時候,比如在startElement方法中,所能夠得到的信息就是標簽的名字和屬性,至于標簽內部的嵌套結構,上層標簽、下層標簽以及其兄弟節(jié)點的名稱等等與其結構相關的信息都是不得而知的。實際上就是把XML文件的結構信息丟掉了,如果需要得到這些信息的話,只能你自己在程序里進行處理了。所以相對DOM而言,SAX處理XML文檔沒有DOM方便,SAX處理的過程相對DOM而言也比較復雜。

        SAX采用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器:

解析器可以使用JAXP的API創(chuàng)建,創(chuàng)建出SAX解析器后,就可以指定解析器去解析某個XML文檔。

解析器采用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作為方法的參數傳遞給事件處理器。

事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕松地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理。

備注說明:SAX API中主要有四種處理事件的接口,它們分別是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 

 這里使用最多的就是ContentHandler,仔細閱讀 API文檔,了解常用方法:startElement、endElement、characters等

 1.startElement方法說明

void startElement(String uri, 
     String localName, 
     String qName, 
     Attributes atts) 
     throws SAXException 

方法說明:  

解析器在 XML 文檔中的每個元素的開始調用此方法;對于每個 startElement 事件都將有相應的 endElement 事件(即使該元素為空時)。所有元素的內容都將在相應的 endElement 事件之前順序地報告。   

參數說明:  

uri - 名稱空間 URI,如果元素沒有名稱空間 URI,或者未執(zhí)行名稱空間處理,則為空字符串  
localName - 本地名稱(不帶前綴),如果未執(zhí)行名稱空間處理,則為空字符串  
qName - 限定名(帶有前綴),如果限定名不可用,則為空字符串  
atts - 連接到元素上的屬性。如果沒有屬性,則它將是空 Attributes 對象。在 startElement 返回后,此對象的值是未定義的  

 2.endElement方法說明

void endElement(String uri, 

    String localName, 
    String qName) 
    throws SAXException接收元素結束的通知。 

SAX 解析器會在 XML 文檔中每個元素的末尾調用此方法;對于每個 endElement 事件都將有相應的 startElement 事件(即使該元素為空時)。    

參數:  

uri - 名稱空間 URI,如果元素沒有名稱空間 URI,或者未執(zhí)行名稱空間處理,則為空字符串  
localName - 本地名稱(不帶前綴),如果未執(zhí)行名稱空間處理,則為空字符串  
qName - 限定的 XML 名稱(帶前綴),如果限定名不可用,則為空字符串  

3.characters方法

void characters(char[] ch, 
    int start, 
    int length) 
    throws SAXException 

接收字符數據的通知,可以通過new String(ch,start,length)構造器,創(chuàng)建解析出來的字符串文本.  

參數:  

ch - 來自 XML 文檔的字符  
start - 數組中的開始位置  
length - 從數組中讀取的字符的個數   

其它方法請參考api數據

下面我們就具體講解sax解析的操作.

一.我們通過XMLReaderFactory、XMLReader完成,步驟如下

1.通過XMLReaderFactory創(chuàng)建XMLReader對象  

XMLReader reader = XMLReaderFactory.createXMLReader();  

2. 設置事件處理器對象  

reader.setContentHandler(new MyDefaultHandler()); 

3.讀取要解析的xml文件  

FileReader fileReader =new FileReader(new File("src\\sax\\startelement\\web.xml")); 

4.指定解析的xml文件  

reader.parse(new InputSource(fileReader)); 

案例:通過案例對uri、localName、qName和attribute參數有更加深入的了解

1.首先創(chuàng)建要解析的web.xml文件,內容如下

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" 
 xmlns:csdn="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
 <csdn:display-name></csdn:display-name>  
</web-app> 
<!-- 
uri - 名稱空間 URI,如果元素沒有任何名稱空間 URI,或者沒有正在執(zhí)行名稱空間處理,則為空字符串。 
xml namespace-xmlns 
localName - 本地名稱(不帶前綴),如果沒有正在執(zhí)行名稱空間處理,則為空字符串。 
qName - 限定的名稱(帶有前綴),如果限定的名稱不可用,則為空字符串。 
attributes - 附加到元素的屬性。如果沒有屬性,則它將是空的 Attributes 對象。 
 --> 

2.創(chuàng)建解析測試類及事件處理的內部類代碼如下

package sax.startelement; 
import java.io.File; 
import java.io.FileReader; 
import org.junit.Test; 
import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.helpers.XMLReaderFactory; 
public class Demo3 { 
 @Test 
 public void test() throws Exception { 
  // 通過XMLReaderFactory創(chuàng)建XMLReader對象 
  XMLReader reader = XMLReaderFactory.createXMLReader(); 
  // 設置事件處理器對象 
  reader.setContentHandler(new MyDefaultHandler()); 
  // 讀取要解析的xml文件 
  FileReader fileReader = new FileReader(new File( 
    "src\\sax\\startelement\\web.xml")); 
  // 指定解析的xml文件 
  reader.parse(new InputSource(fileReader)); 
 } 
 // 自定義的解析類,通過此類中的startElement了解uri,localName,qName,Attributes的含義 
 class MyDefaultHandler extends DefaultHandler { 
  @Override 
  public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 
   super.startElement(uri, localName, qName, attributes); 
   System.out 
     .println("--------------startElement開始執(zhí)行--------------------------"); 
   System.out.println("uri:::" + uri); 
   System.out.println("localName:::" + localName); 
   System.out.println("qName:::" + qName); 
   for (int i = 0; i < attributes.getLength(); i++) { 
    String value = attributes.getValue(i);// 獲取屬性的value值 
    System.out.println(attributes.getQName(i) + "-----" + value); 
   } 
   System.out 
     .println("------------------startElement執(zhí)行完畢---------------------------"); 
  } 
 } 
} 

3.程序運行的結果如下:

通過運行結果,希望你對uri,localName,qName有更加深入的了解.

二.我們通過SAXParserFactory、SAXParser、XMLReader完成,步驟如下

1.使用SAXParserFactory創(chuàng)建SAX解析工廠

SAXParserFactory spf = SAXParserFactory.newInstance();

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

SAXParser sp = spf.newSAXParser();

3.通過解析器對象得到一個XML的讀取器

XMLReader xmlReader = sp.getXMLReader();

4.設置讀取器的事件處理器

xmlReader.setContentHandler(new BookParserHandler());

5.解析xml文件

xmlReader.parse("book.xml");

說明:如果只是使用SAXParserFactory、SAXParser他們完成只需要如下3步驟

1.獲取sax解析器的工廠對象

SAXParserFactory factory = SAXPar
serFactory.newInstance();

2.通過工廠對象 SAXParser創(chuàng)建解析器對象

SAXParser saxParser = factory.newSAXParser();

3.通過解析saxParser的parse()方法設定解析的文件和自己定義的事件處理器對象

saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler());

案例:解析出"作者"元素標簽中的文本內容

1.需要解析的sida.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE 四大名著[ 
<!ELEMENT 四大名著 (西游記,紅樓夢)> 
<!ATTLIST 西游記 id ID #IMPLIED> 
]> 
<四大名著> 
 <西游記 id="x001"> 
  <作者>吳承恩</作者> 
 </西游記> 
 <紅樓夢 id="x002"> 
  <作者>曹雪芹</作者> 
 </紅樓夢> 
</四大名著> 

2.解析測試類和事件處理器類的實現代碼

package sax; 
import java.io.File; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.junit.Test; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
public class SaxTest { 
 @Test 
 public void test() throws Exception { 
  // 1.獲取sax解析器的工廠對象 
  SAXParserFactory factory = SAXParserFactory.newInstance(); 
  // 2.通過工廠對象 SAXParser創(chuàng)建解析器對象 
  SAXParser saxParser = factory.newSAXParser(); 
  // 3.通過解析saxParser的parse()方法設定解析的文件和自己定義的事件處理器對象 
  saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler()); 
 } 
 // 自己定義的事件處理器 
 class MyDefaultHandler extends DefaultHandler { 
  // 解析標簽開始及結束的的標識符 
  boolean isOk = false; 
  @Override 
  public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 
   super.startElement(uri, localName, qName, attributes); 
   // 當解析作者元素開始的時候,設置isOK為true 
   if ("作者".equals(qName)) { 
    isOk = true; 
   } 
  } 
  @Override 
  public void characters(char[] ch, int start, int length) 
    throws SAXException { 
   // TODO Auto-generated method stub 
   super.characters(ch, start, length); 
   // 當解析的標識符為true時,打印元素的內容 
   if (isOk) { 
    System.out.println(new String(ch, start, length)); 
   } 
  } 
  @Override 
  public void endElement(String uri, String localName, String qName) 
    throws SAXException { 
   super.endElement(uri, localName, qName); 
   // 當解析作者元素的結束的時候,設置isOK為false 
   if ("作者".equals(qName)) { 
    isOk = false; 
   } 
  } 
 } 
} 

3.程序運行結果如下:

相關文章

  • Spring AOP訪問目標方法的參數操作示例

    Spring AOP訪問目標方法的參數操作示例

    這篇文章主要介紹了Spring AOP訪問目標方法的參數操作,結合實例形式詳細分析了spring面向切面AOP訪問目標方法的參數相關實現步驟與操作注意事項,需要的朋友可以參考下
    2020-01-01
  • SpringBoot處理接口冪等性的兩種方法詳解

    SpringBoot處理接口冪等性的兩種方法詳解

    接口冪等性處理算是一個非常常見的需求了,我們在很多項目中其實都會遇到。本文為大家總結了兩個處理接口冪等性的兩種常見方案,需要的可以參考一下
    2022-06-06
  • SpringBoot使用hutool操作FTP的詳細過程

    SpringBoot使用hutool操作FTP的詳細過程

    在使用SpringBoot結合hutool操作FTP時,遇到防火墻導致上傳文件大小為0kb的問題,通過設置FTP為被動模式解決,本文詳細解析了FTP的主動模式和被動模式的工作原理、安全性及適用場景,幫助理解FTP的連接方式和解決網絡限制問題
    2024-09-09
  • SpringCloud微服務多應用腳手架的搭建與部署方式

    SpringCloud微服務多應用腳手架的搭建與部署方式

    這篇文章主要介紹了SpringCloud微服務多應用腳手架的搭建與部署方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot實現加載yml文件中字典數據

    SpringBoot實現加載yml文件中字典數據

    這篇文章主要為大家詳細介紹了SpringBoot如何實現加載yml文件中字典數據,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • Spring如何基于Proxy及cglib實現動態(tài)代理

    Spring如何基于Proxy及cglib實現動態(tài)代理

    這篇文章主要介紹了Spring如何基于Proxy及cglib實現動態(tài)代理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 基于SpringMVC對接前端參數注解

    基于SpringMVC對接前端參數注解

    這篇文章主要介紹了基于SpringMVC對接前端參數注解的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java多線程讀取多個文件的方法

    java多線程讀取多個文件的方法

    這篇文章主要為大家詳細介紹了java多線程讀取多個文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java中的Reference和引用類型實例精講

    java中的Reference和引用類型實例精講

    這篇文章主要為大家介紹了java中的Reference和引用類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Springboot詳解整合SpringSecurity實現全過程

    Springboot詳解整合SpringSecurity實現全過程

    Spring Security基于Spring開發(fā),項目中如果使用Springboot作為基礎,配合Spring Security做權限更加方便,而Shiro需要和Spring進行整合開發(fā)。因此作為spring全家桶中的Spring Security在java領域很常用
    2022-07-07

最新評論