• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • android SAX解析XML

    SAX(Simple APIfor XML)解析器是一種基于事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件后,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行為。SAX解析器的優點是解析速度快,占用內存少。非常適合在Android移動設備中使用。

    SAX的工作原理:SAX的工作原理簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然后繼續同樣的掃描,直至文檔結束。

    在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通過parser()方法來解析XML文檔,并產生事件。事件處理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個接口。XMLReader通過相應事件處理器注冊方法setXXXX()來完成的與ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個接口的連接。

    常用的SAX接口和類:

    Attrbutes:用于得到屬性的個數、名字和值。

    ContentHandler:定義與文檔本身關聯的事件(例如,開始和結束標記)。大多數應用程序都注冊這些事件。

    DTDHandler:定義與DTD關聯的事件。它沒有定義足夠的事件來完整地報告DTD。如果需要對DTD進行語法分析,請使用可選的DeclHandler。

    DeclHandler是SAX的擴展。不是所有的語法分析器都支持它。

    EntityResolver:定義與裝入實體關聯的事件。只有少數幾個應用程序注冊這些事件。

    ErrorHandler:定義錯誤事件。許多應用程序注冊這些事件以便用它們自己的方式報錯。

    DefaultHandler:它提供了這些接LI的缺省實現。在大多數情況下,為應用程序擴展DefaultHandler并覆蓋相關的方法要比直接實現一個接口更容易。

    處理器名稱

    處理事件

    注冊方式

    ContentHandler

    解析XML文檔內容

    setContentHandler(ContentHandler)

    ErrorHandler

    處理XML文檔產生的錯誤

    setErrorHandler(ErrorHandler)

    DTDHandler

    處理DTD解析時產生的相應事件

    setDTDHandler(DTDHandler)

    EntityResolver

    處理外部實體

    setEntityResolver(EntityResolver)






    public class Pinfor {
    
    	private String serialNumber;
    	
    	private String serviceid;
    	
    	private String type;
    	
    	private String data;
    	
    	private String title;
    	
    	private Object reserved;
    	
    	public String getSerialNumber() {
    		return serialNumber;
    	}
    	public void setSerialNumber(String serialNumber) {
    		this.serialNumber = serialNumber;
    	}
    	
    	public Object getReserved() {
    		return reserved;
    	}
    	public void setReserved(Object reserved) {
    		this.reserved = reserved;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    
    	public String getServiceid() {
    		return serviceid;
    	}
    	public void setServiceid(String serviceid) {
    		this.serviceid = serviceid;
    	}
    	public String getType() {
    		return type;
    	}
    	public void setType(String type) {
    		this.type = type;
    	}
    	public String getData() {
    		return data;
    	}
    	public void setData(String data) {
    		this.data = data;
    	}
    }

    	/**
    	 * 從流中直接解析XML
    	 * @return
    	 */
    	public  List<Pinfor> parserXmlBySax(InputStream inputStream){
    		XMLContentHandler xmlHandler  = null;
    		try {
    			//從SAXPsrser中得到一個XMLReader實例
    			XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
    			//把自己寫的handler注冊到XMLReader中
    			xmlHandler = new XMLContentHandler();
    			reader.setContentHandler(xmlHandler);
    			//將一個xml文檔或者資源變成一個java可以處理的InputStream流后,解析正式開始
    			reader.parse(new InputSource(inputStream));			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			Log4debug.e(TAG, "parserXmlBySax",e.getMessage());
    		}
    		return xmlHandler.getResultList();
    	}

    //SAX ContentHander解析XML文件處理過程
    class XMLContentHandler extends DefaultHandler{
    	
    	private List<Pinfor> list = null;
    	private Pinfor infor = null;
    	private String tagName = null;
    	
    	 public List<Pinfor> getResultList() {
    		return list;
    	}
    
    	public void setTagName(String tagName) {
    		this.tagName = tagName;
    	}
    
    	@Override
    	public void startDocument() throws SAXException {
    		// TODO Auto-generated method stub
    		list = new ArrayList<Pinfor>();
    	}
    	
    	@Override
    	public void endDocument() throws SAXException {
    		// TODO Auto-generated method stub
    		super.endDocument();
    	}
    
    	
    	//解析節點內容回調函數
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		String data=new String(ch,start,length);
    		if (tagName != null) {
    			if (tagName.equals("serviceid")) { //對象屬性標簽
    				infor.setServiceid(data);		
    			}
    			else if (tagName.equals("type")) {
    				infor.setType(data);
    			}
    			else if (tagName.equals("title")) {
    				infor.setTitle(data);
    			}
    			else if (tagName.equals("data")) {
    				infor.setData(data);
    			}
    			else if (tagName.equals("RESERVED")) {
    				infor.setReserved(data);
    			}
    		}
    	}
    
    	//XML解析器遇到XML里面的標簽時就會調用這個函數
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		// TODO Auto-generated method stub
    		if (qName.equals("item")) { //對象標簽
    			infor = new Pinfor();
    		}
    		this.setTagName(qName);
    	}
    	
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		if (qName.equals("item")&& infor!= null) { //對象標簽
    			list.add(infor);
    		}
    		this.setTagName(null);
    	}
    
    	@Override
    	public void startPrefixMapping(String prefix, String uri)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		super.startPrefixMapping(prefix, uri);
    	}
    	
    	@Override
    	public void endPrefixMapping(String prefix) throws SAXException {
    		// TODO Auto-generated method stub
    		super.endPrefixMapping(prefix);
    	}	
    }

    版權聲明:本文為iteye_13202原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iteye_13202/article/details/82412328

    智能推薦

    Android開發:XML簡介及DOM、SAX、PULL解析對比

    目錄 目錄 定義 XML(extensible Markup Language) ,是一種數據標記語言 & 傳輸格式 作用 對數據進行標記(結構化數據) 對數據進行存儲 對數據進行傳輸 與html的區別:html用于顯示信息;xml用于存儲&傳輸信息 XML特點 標簽可進行自定義 XML允許作者定義自己的標簽和文檔結構 自我描述性 XML文檔實例 僅僅是一個純文本,有文本處理能力的...

    Android使用Sax 及Pull 解析Xml demo

    客戶端開發中,越來越多的接口使用的數據傳輸類型時json了,xml相對較少。恰好當前要使用到了xml傳遞數據,寫個demo權當記錄安卓中如何使用sax 及 pull解析xml. 1.常用的幾種解析XML的方式   Dom ,Sax ,Pull  Dom解析Xml 是將整個Xm文檔當成一個對象來處理,會先把整個文檔讀入到內存里。是基于樹的結構,通常需要加載整文檔和構造DOM樹,然...

    我的Android進階之旅------>Android中解析XML 技術詳解---->SAX解析、DOM解析、PULL解析...

    XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的XML解析和創建的方法。 在Android中,常見的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面,我將一一向大家詳細介紹。 SAX解析器: SAX(Simple API for XML)...

    android解析XML文件的三方法之SAX

        采用DOM方法讀取XML文檔,由于使用DOM方法需要將整個XML文檔加載內存中,對系統資源占用比較多,這對內存比較緊張的Android系統來說,使用 DOM方法讀取XML文檔會有很大的限制。 使用SAX方法讀取XML,對內存資源的占用的比較少,因此在嵌入式設備中極力推薦使用,Android也不例外,本篇幅詳細說明Android中如何使用SAX讀取XM...

    深入分析android中用SAX解析XML文件并糾錯

    在android中解析XML文件有很多方法,今天主要介紹下SAX解析。 1、SAX簡介 SAX是基于事件驅動模型,可以捕獲到讀取文檔過程中產生的事件,比如開始文檔、結束文檔、開始元素、結束元素、文本內容事件等。通過定義一個事件處理器,在這些事件觸發后,來實現數據的獲取。通過使用XMLReader類來注冊事件處理器,在Android中有如下4個事件處理器接口,如下圖: 補充:事件驅動模型是事件源發出...

    猜你喜歡

    Xml 解析:(sax 解析)

    sax解析的原理()      解析xml有兩種技術 dom 和sax      根據xml的層級結構在內存中分配一個樹形結構      把xml中標簽,屬性,文本封裝成對象      sax方式:事件驅動,邊讀邊解析   &nb...

    XML的SAX解析

    SAX是一個順序執行,事件驅動的解析方法(事件驅動,簡單地說就是你點什么按鈕(即產生什么事件))   SAX的工作原理;           DOM解析博客地址連接:DOM解析 SAX與DOM解析的優點;SAX解析適合較大的XML文件解析,DOM可以增加節點   SAX解析的主要方法;   JAVA...

    SAX-解析XML

    基于SAX的xml解析 sax通常用來進行查找,就是搜索使用,大概流程如下 解析器工廠 解析器 XMLReader 處理器ContentHandler,這部分需要程序員自己寫 進行遍歷和指定位置查找 小結 SAX的優勢在于,找多少就加載多少,不會一下子擠滿內存,但是缺點是比較麻煩- -,處理部分 得程序員自己手寫,其實也還好.做個筆記把...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡