




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對XML數(shù)據(jù)進行增刪改查操作
本篇文章為大家展示了怎么在Android中使用SAX對XML數(shù)據(jù)進行增刪改查操作,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。前言解析XML的方式有很多種,大家比較熟悉的可能就是DOM解析。DOM(文件對象模型)解析:解析器讀入整個文檔,然后構(gòu)建一個駐留內(nèi)存的樹結(jié)構(gòu),然后代碼就可以根據(jù)DOM接口來操作這個樹結(jié)構(gòu)了。優(yōu)點:整個文檔讀入內(nèi)存,方便操作:支持修改、刪除和重現(xiàn)排列等多種功能。缺點:將整個文檔讀入內(nèi)存中,保留了過多的不需要的節(jié)點,浪費內(nèi)存和空間。使用場合:一旦讀入文檔,還需要多次對文檔進行操作,并且在硬件資源充足的情況下(內(nèi)存,CPU)。為了解決DOM解析存在的問題,就出現(xiàn)了SAX解析。其特點為:優(yōu)點:不用實現(xiàn)調(diào)入整個文檔,占用資源少。尤其在嵌入式環(huán)境中,如android,極力推薦使用SAX解析。缺點:不像DOM解析一樣將文檔長期駐留在內(nèi)存中,數(shù)據(jù)不是持久的。如果事件過后沒有保存數(shù)據(jù),數(shù)據(jù)就會丟失。使用場合:機器有性能限制。本文將給大家詳細介紹關(guān)于Android利用SAX對XML增刪改查的相關(guān)內(nèi)容,分享出來供大家參考學習價值,下面話不多說了,來一起看看詳細的介紹吧。1.概述SAX是一中事件驅(qū)動類型的XML解析方式。說白了,就是通過復寫一個Default類去告知,解析的結(jié)果。SAX并不會想DOM那樣把整個的XML加載到內(nèi)存中,而它會像IO流那樣,一個一個標簽地去解析。簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結(jié)束、元素(element)開始與結(jié)束、文檔(document)結(jié)束等地方時通知事件處理函數(shù),由事件處理函數(shù)做相應(yīng)動作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。為了方便說明,先約定好一個XML如下:<?xml
version="1.0"
encoding="UTF-8"?>
<persons>
<person
id="1"
key="33"
type="type">
<name>zhangsan</name>
<age>21</age>
</person>
</persons>2.基本讀?。ú椋┐a如下SAXParserFactory
factory
=
SAXParserFactory.newInstance();//創(chuàng)建SAX解析工廠
SAXParser
saxParser;
try
{
File
file
=
new
File(xmlFilePath);
InputStream
inputStream
=
new
FileInputStream(file);//得到輸入流
saxParser
=
factory.newSAXParser();//創(chuàng)建解析器
saxParser.parse(inputStream,new
DefaultHandler(){//開始解析
//文檔開始標記
@Override
public
void
startDocument()
throws
SAXException
{
super.startDocument();
Log.i("loadWithSax","startDocument");
}
//文檔結(jié)束標記
@Override
public
void
endDocument()
throws
SAXException
{
super.endDocument();
FileUtils.closeIO(inputStream);
Log.i("loadWithSax","endDocument");
}
//解析到標簽
@Override
public
void
startElement(String
uri,
String
localName,
String
qName,
Attributes
attributes)
throws
SA
super.startElement(uri,
localName,
qName,
attributes);
Log.i("loadWithSax","startElement"+",uri:"+uri+",localName:"+localName+",qName:"+qName);
if
(attributes!=null)
{
for
(int
i
=
0;
i
<
attributes.getLength();
i++)
{
Log.i("loadWithSax",attributes.getLocalName(i)+","+attributes.getValue(i)+","+attributes.
}
}
}
//標簽解析結(jié)束
@Override
public
void
endElement(String
uri,
String
localName,
String
qName)
throws
SAXException
{
super.endElement(uri,
localName,
qName);
Log.i("loadWithSax","endElement"+",uri:"+uri+",localName:"+localName+",qName:"+qName);
}
/**
*
文本
*
該方法中的ch把所解析的xml的所有數(shù)據(jù)都保存進來,且ch初始化為2K數(shù)據(jù)。
start是一個節(jié)點">"的位置。length就是">"到下一個"<"的長度。
*
<namesList>
*
<name>michael</name>
*
</namesList>
*
執(zhí)行namesList節(jié)點時,因為沒有文本,
*
不會執(zhí)行到該方法。
*/
@Override
public
void
characters(char[]
ch,
int
start,
int
length)
throws
SAXException
{
super.characters(ch,
start,
length);
Log.i("loadWithSax","characters"+",start:"+start+",length:"+length);
for
(int
i
=
0;
i
<
ch.length;
i++)
{
Log.i("loadWithSax","char:"+ch[i]+",ASCII:"+(int)ch[i]);
}
}
//警告回調(diào)
@Override
public
void
warning(SAXParseException
e)
throws
SAXException
{
super.warning(e);
Log.i("loadWithSax","warning"+","+e.getMessage());
}
//錯誤回調(diào)
@Override
public
void
error(SAXParseException
e)
throws
SAXException
{
super.error(e);
Log.i("loadWithSax","error1"+","+e.getMessage());
}
});
}
catch
(ParserConfigurationException
|
SAXException
|
IOException
e)
{
e.printStackTrace();
Log.i("loadWithSax","error2"+","+e.getMessage());
}傳入:DefaultHandler的實體,通過復寫其中的方法,查詢到文檔,標簽的內(nèi)容:startDocument和endDocument是掃描文檔的開始和結(jié)束startElement,是解析到了標簽,localName就是標簽的名稱,如本文所示例的,當解析到第一個人名的時候,<person
id="1"
key="33"
type="type">
<name>zhangsan</name>
<age>21</age>
</person>解析到<person></person>回調(diào):startElement,標簽內(nèi)的參數(shù)是Attributesattributes,一個for循環(huán)就可以遍歷讀取。characters,解析到標簽的內(nèi)容時候回調(diào),接著上面例子,解析<person></person>,回調(diào)startElement,然后不會回調(diào)此方法,因為內(nèi)容不是文本,而是包含了標簽,所以,解析到其子標簽:<name>zhangsan</name>的時候,又會先回調(diào)回調(diào)startElement,然后,才回調(diào)characters,告訴你,這個標簽里面有文本內(nèi)容!參數(shù)說明如下:char[]:內(nèi)容字符數(shù)組里面。如:<name>zhangsan</name>,char[]就是:{'z','h','a','n','g','s','a','n'}start:0,文本的開始length:文本的長度。endElement,標簽結(jié)束。使用上面的代碼,得到的部分log如下:I/loadWithSax:
startDocument
I/loadWithSax:
startElement,uri:,localName:persons,qName:persons
I/loadWithSax:
characters,start:0,length:1
I/loadWithSax:
char:
,ASCII:10
I/loadWithSax:
characters,start:0,length:1
I/loadWithSax:
char:
,ASCII:9
I/loadWithSax:
startElement,uri:,localName:person,qName:person
I/loadWithSax:
id,1,CDATA
I/loadWithSax:
key,33,CDATA
I/loadWithSax:
type,type,CDATA
I/loadWithSax:
characters,start:0,length:1
I/loadWithSax:
char:
,ASCII:10
I/loadWithSax:
characters,start:0,length:2
I/loadWithSax:
char:
,ASCII:9
I/loadWithSax:
char:
,ASCII:9
I/loadWithSax:
startElement,uri:,localName:name,qName:name
I/loadWithSax:
characters,start:0,length:8
I/loadWithSax:
char:z,ASCII:122
I/loadWithSax:
char:h,ASCII:104
I/loadWithSax:
char:a,ASCII:97
I/loadWithSax:
char:n,ASCII:110
I/loadWithSax:
char:g,ASCII:103
I/loadWithSax:
char:s,ASCII:115
I/loadWithSax:
char:a,ASCII:97
I/loadWithSax:
char:n,ASCII:110
I/loadWithSax:
endElement,uri:,localName:name,qName:namestartDocument,開始解析xml解析到第一個標簽的開始:<persons>然后解析到了內(nèi)容???characters?按照我上面的分析,<persons>標簽內(nèi)沒有文字內(nèi)容,應(yīng)該不會回調(diào)。其實,這里回調(diào)的是換行符。log中打出了ASCII碼,10就是換行。然后,還有一個tab符。然后就是<persons>里面的<person>,有三個參數(shù):id,key,type,巴拉巴拉。。。3.保存sax的保存有點麻煩。具體是XmlSerializer的使用。初始化一個XmlSerializer:StringWriter
stringWriter
=
new
StringWriter();
XmlPullParserFactory
factory
=
XmlPullParserFactory.newInstance();
XmlSerializer
xmlSerializer
=
factory.newSerializer();
xmlSerializer.setOutput(stringWriter);聲明文檔的開始和結(jié)束:xmlSerializer.startDocument("utf-8",
false);//false,是聲明:standalone的值。
xmlSerializer.endDocument();標簽的開始結(jié)束,和寫入內(nèi)容:xmlSerializer.startTag(null,
"name");//開始,第一個參數(shù)是namespace,命名空間。
xmlSerializer.text();//寫入內(nèi)容
xmlSerializer.endTag(null,
"name");實戰(zhàn):假如,我們需要構(gòu)建如下的XML:<?xml
version='1.0'
encoding='utf-8'
standalone='yes'
?>
<persons>
<person
id="1"
key="33"
type="type">
<name>zhangsan</name>
<age>21</age>
</person>
<person>
<name>lisi</name>
<age>12</age>
</person>
<person>
<name>wangwu</name>
<age>23</age>
</person>
</persons>首先你得定義好一個Bean類,Person:public
class
Person
{
public
int
id
=
-1;
public
String
key
=
null;
public
String
type
=
null;
public
String
name;
public
int
age;
public
Person(String
name,
int
age)
{
=
name;
this.age
=
age;
}
}然后開擼:最后的stringWriter就是你想要的數(shù)據(jù),注意就是,一些換行和tab符。StringWriter
stringWriter
=
new
StringWriter();
try
{
XmlPullParserFactory
factory
=
XmlPullParserFactory.newInstance();
XmlSerializer
xmlSerializer
=
factory.newSerializer();
xmlSerializer.setOutput(stringWriter);
//制造假數(shù)據(jù):
ArrayList<Person>
personArrayList
=
new
ArrayList<>();
Person
person1
=
new
Person("zhangsan",21);
person1.id=1;
person1.key="33";
person1.type="type";
Person
person2
=
new
Person("lisi",12);
Person
person3
=
new
Person("wangwu",23);
personArrayList.add(person1);
personArrayList.add(person2);
personArrayList.add(person3);
//star
document
xmlSerializer.startDocument("utf-8",
true);
xmlSerializer.text("\n");
xmlSerializer.startTag(null,
"persons");
for(Person
person:personArrayList){
//star
tag
xmlSerializer.text("\n");
xmlSerializer.text("\t");
xmlSerializer.startTag(null,
"person");
//添加參數(shù)
if
(person.id!=-1)
{
xmlSerializer.attribute(null,"id",String.valueOf(person.id));
}
if
(person.key!=null)
{
xmlSerializer.attribute(null,"key",person.key);
}
if
(person.type!=null)
{
xmlSerializer.attribute(null,"type",person.type);
}
//添加內(nèi)容:name
xmlSerializer.text("\n");
xmlSerializer.text("\t");
xmlSerializer.text("\t");
xmlSerializer.startTag(null,
"name");
xmlSerializer.text();
xmlSerializer.endTag(null,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 影像科CT技師上崗證真題與答案
- 游客行為分析優(yōu)化旅游服務(wù)
- 企業(yè)培訓課件價值觀
- 企業(yè)培訓技巧課件
- 英語全能閱讀強化練(十五)
- 優(yōu)化外資利用結(jié)構(gòu)改進措施
- 企業(yè)培訓車輛無償借用及管理合同
- 美容養(yǎng)生連鎖店按摩技師團隊承包合同
- 高效采購合同談判策略與標的物協(xié)議
- 彩票站與彩票代銷商代理合作協(xié)議
- 2023-2024學年深圳市鹽田區(qū)數(shù)學四下期末學業(yè)水平測試試題含解析
- 虛擬股權(quán)激勵方案(模板)
- 19S406建筑排水管道安裝-塑料管道
- 2024-2029年中國管道運輸行業(yè)發(fā)展分析及發(fā)展前景與投資研究報告
- 泰文租房合同
- 建筑維修與保養(yǎng)方法
- 金華出租車從業(yè)資格證模擬考試題
- (完整)中醫(yī)癥候積分量表
- 勞務(wù)外包三方協(xié)議
- 水果禮盒創(chuàng)業(yè)計劃書
- 水產(chǎn)養(yǎng)殖行業(yè)營銷策略方案
評論
0/150
提交評論