版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作
本篇文章為大家展示了怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。前言解析XML的方式有很多種,大家比較熟悉的可能就是DOM解析。DOM(文件對(duì)象模型)解析:解析器讀入整個(gè)文檔,然后構(gòu)建一個(gè)駐留內(nèi)存的樹結(jié)構(gòu),然后代碼就可以根據(jù)DOM接口來操作這個(gè)樹結(jié)構(gòu)了。優(yōu)點(diǎn):整個(gè)文檔讀入內(nèi)存,方便操作:支持修改、刪除和重現(xiàn)排列等多種功能。缺點(diǎn):將整個(gè)文檔讀入內(nèi)存中,保留了過多的不需要的節(jié)點(diǎn),浪費(fèi)內(nèi)存和空間。使用場(chǎng)合:一旦讀入文檔,還需要多次對(duì)文檔進(jìn)行操作,并且在硬件資源充足的情況下(內(nèi)存,CPU)。為了解決DOM解析存在的問題,就出現(xiàn)了SAX解析。其特點(diǎn)為:優(yōu)點(diǎn):不用實(shí)現(xiàn)調(diào)入整個(gè)文檔,占用資源少。尤其在嵌入式環(huán)境中,如android,極力推薦使用SAX解析。缺點(diǎn):不像DOM解析一樣將文檔長期駐留在內(nèi)存中,數(shù)據(jù)不是持久的。如果事件過后沒有保存數(shù)據(jù),數(shù)據(jù)就會(huì)丟失。使用場(chǎng)合:機(jī)器有性能限制。本文將給大家詳細(xì)介紹關(guān)于Android利用SAX對(duì)XML增刪改查的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí)價(jià)值,下面話不多說了,來一起看看詳細(xì)的介紹吧。1.概述SAX是一中事件驅(qū)動(dòng)類型的XML解析方式。說白了,就是通過復(fù)寫一個(gè)Default類去告知,解析的結(jié)果。SAX并不會(huì)想DOM那樣把整個(gè)的XML加載到內(nèi)存中,而它會(huì)像IO流那樣,一個(gè)一個(gè)標(biāo)簽地去解析。簡(jiǎn)單地說就是對(duì)文檔進(jìn)行順序掃描,當(dāng)掃描到文檔(document)開始與結(jié)束、元素(element)開始與結(jié)束、文檔(document)結(jié)束等地方時(shí)通知事件處理函數(shù),由事件處理函數(shù)做相應(yīng)動(dòng)作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。為了方便說明,先約定好一個(gè)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(){//開始解析
//文檔開始標(biāo)記
@Override
public
void
startDocument()
throws
SAXException
{
super.startDocument();
Log.i("loadWithSax","startDocument");
}
//文檔結(jié)束標(biāo)記
@Override
public
void
endDocument()
throws
SAXException
{
super.endDocument();
FileUtils.closeIO(inputStream);
Log.i("loadWithSax","endDocument");
}
//解析到標(biāo)簽
@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.
}
}
}
//標(biāo)簽解析結(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ù)都保存進(jìn)來,且ch初始化為2K數(shù)據(jù)。
start是一個(gè)節(jié)點(diǎn)">"的位置。length就是">"到下一個(gè)"<"的長度。
*
<namesList>
*
<name>michael</name>
*
</namesList>
*
執(zhí)行namesList節(jié)點(diǎn)時(shí),因?yàn)闆]有文本,
*
不會(huì)執(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());
}
//錯(cuò)誤回調(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的實(shí)體,通過復(fù)寫其中的方法,查詢到文檔,標(biāo)簽的內(nèi)容:startDocument和endDocument是掃描文檔的開始和結(jié)束startElement,是解析到了標(biāo)簽,localName就是標(biāo)簽的名稱,如本文所示例的,當(dāng)解析到第一個(gè)人名的時(shí)候,<person
id="1"
key="33"
type="type">
<name>zhangsan</name>
<age>21</age>
</person>解析到<person></person>回調(diào):startElement,標(biāo)簽內(nèi)的參數(shù)是Attributesattributes,一個(gè)for循環(huán)就可以遍歷讀取。characters,解析到標(biāo)簽的內(nèi)容時(shí)候回調(diào),接著上面例子,解析<person></person>,回調(diào)startElement,然后不會(huì)回調(diào)此方法,因?yàn)閮?nèi)容不是文本,而是包含了標(biāo)簽,所以,解析到其子標(biāo)簽:<name>zhangsan</name>的時(shí)候,又會(huì)先回調(diào)回調(diào)startElement,然后,才回調(diào)characters,告訴你,這個(gè)標(biāo)簽里面有文本內(nèi)容!參數(shù)說明如下:char[]:內(nèi)容字符數(shù)組里面。如:<name>zhangsan</name>,char[]就是:{'z','h','a','n','g','s','a','n'}start:0,文本的開始length:文本的長度。endElement,標(biāo)簽結(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解析到第一個(gè)標(biāo)簽的開始:<persons>然后解析到了內(nèi)容???characters?按照我上面的分析,<persons>標(biāo)簽內(nèi)沒有文字內(nèi)容,應(yīng)該不會(huì)回調(diào)。其實(shí),這里回調(diào)的是換行符。log中打出了ASCII碼,10就是換行。然后,還有一個(gè)tab符。然后就是<persons>里面的<person>,有三個(gè)參數(shù):id,key,type,巴拉巴拉。。。3.保存sax的保存有點(diǎn)麻煩。具體是XmlSerializer的使用。初始化一個(gè)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();標(biāo)簽的開始結(jié)束,和寫入內(nèi)容:xmlSerializer.startTag(null,
"name");//開始,第一個(gè)參數(shù)是namespace,命名空間。
xmlSerializer.text();//寫入內(nèi)容
xmlSerializer.endTag(null,
"name");實(shí)戰(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>首先你得定義好一個(gè)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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 株洲市房屋買賣合同中的合同違約調(diào)解
- 清算后期服務(wù)協(xié)議
- 小紅書:教你打造小紅書藍(lán)V專業(yè)號(hào)【互聯(lián)網(wǎng)】【藍(lán)V運(yùn)營】
- 九年級(jí)化學(xué)上冊(cè) 第六單元 碳和碳的化合物 課題1 金剛石、石墨、C60教案 (新版)新人教版
- 二年級(jí)體育上冊(cè) 2.2出升的太陽教案
- 2024秋八年級(jí)英語下冊(cè) Module 1 Feelings and impressions Unit 3 Language in use教案含教學(xué)反思(新版)外研版
- 2024-2025學(xué)年學(xué)年高中英語 Module2 A job worth doing教案 外研版必修5
- 2024-2025學(xué)年高中英語下學(xué)期第18周教學(xué)設(shè)計(jì)
- 2024秋八年級(jí)英語上冊(cè) Unit 7 Will people have robots教案 (新版)人教新目標(biāo)版
- 2023七年級(jí)地理上冊(cè) 第一章 地球和地圖 第四節(jié) 地形圖的判讀說課稿 (新版)新人教版
- 儲(chǔ)氣罐保養(yǎng)記錄表
- 計(jì)算思維與程序設(shè)計(jì)
- 境外安全管理培訓(xùn)(海外)課件
- 《應(yīng)對(duì)同伴壓力》課件
- 主題漫展策劃方案
- 小學(xué)生自主學(xué)習(xí)能力培養(yǎng)及教師指導(dǎo)策略
- 振動(dòng)試驗(yàn)及振動(dòng)試驗(yàn)設(shè)備培訓(xùn)
- 高二數(shù)學(xué)雙曲線試題(有答案)
- 財(cái)務(wù)管理的數(shù)字化轉(zhuǎn)型實(shí)施方案
- 線上廚藝大賽投票方案
- 家長課程:怎樣提升孩子的自護(hù)技能
評(píng)論
0/150
提交評(píng)論