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);
}
}
智能推薦
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的優勢在于,找多少就加載多少,不會一下子擠滿內存,但是缺點是比較麻煩- -,處理部分 得程序員自己手寫,其實也還好.做個筆記把...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...