【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中使用SAX對(duì)XML數(shù)據(jù)進(jìn)行增刪改查操作_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論