You are on page 1of 12

Lm vic vi XML trn Android

Xy dng cc ng dng Java cho cc thit b| di dng


Muc d: Trung bnh
Michael Galpin, Kin trc su phn mm, Ludi Labs
08 01 2010
Android l mt h diu hnh ngun mo, hin dai v l SDK cho cc thit bi di dng. Voi h diu hnh
ny, ban c th tao ra cc ung dung di dng rt manh. Diu ny thm ch cn tro nn hp dn hon nua
khi cc ung dung cua ban c th truy cp cc dich vu Web, c nghia l ban cn su dung ngn ngu cua
Web l: XML. Trong bi vit ny, ban s thy nhiu lua chon khc nhau d lm vic voi XML trn
Android v cch su dung chng d xy dung cc ung dung Android cua chnh ban.
Bt du
Trong bi vit ny, ban hoc cch xy dung cc ung dung Android c th lm vic voi XML tu Internet. Cc ung dung
Android duoc vit bng ngn ngu lp trnh Java, do vy m kinh nghim lm vic voi cng ngh Java l diu cn
phai c. D pht trin cho Android, ban s cn dn Android SDK. Ton b m trnh duoc trnh by trong bi vit ny
s lm vic voi bt ky phin ban no cua Android SDK, nhung phin ban SDK 1.5_pre d duoc su dung d pht trin
m trnh. Ban c th pht trin cc ung dung Android chi voi SDK v mt trnh bin tp vn ban l du, nhung s d
dng hon nhiu nu su dung Android Developer Tools (ADT), l mt trnh b sung Eclipse. Di voi bi vit ny,
phin ban 0.9 cua ADT d duoc dng voi Eclipse 3.4.2, mt phin ban Java. Xem Ti nguyn d ly cc lin kt dn
dn tt ca cc cng cu ny.



XML trn Android
Nn tang Android l mt nn tang pht trin di dng m ngun mo. N gip ban truy cp vo tt ca cc kha canh cua
thit bi di dng m n chay trn d, tu cc d hoa cp thp, dn phn cung nhu l thit bi camera trn din thoai. Voi
rt nhiu thu c th su dung Android, c th ban s tu hoi tai sao ban cn phin dn XML. D khng phai v lm vic
voi XML rt th vi; m l n dang lm vic voi nhung thu m n kch hoat. XML thuong duoc dng nhu l mt dinh
dang du liu trn Internet. Nu ban mun truy cp du liu tu Internet, cc kha nng c th l du liu s o dang XML.
Nu ban mun gui du liu dn mt dich vu Web, c th ban cung cn gui ca du liu XML. Ni ngn gon l nu ung
dung Android cua ban thc dy Internet, th c th ban s cn phai lm vic voi XML. Tht may mn l ban c rt
nhiu lua chon c sn d lm vic voi XML trn Android.



Cc trnh phn tch XML
Mt trong nhun uu dim lon nht cua nn tang Android chnh l vic n
thc dy ngn ngu lp trnh Java. Android SDK khng hon ton cung cp
sn moi thu cho Mi truong Thoi gian chay Java (JRE) chun cua ban,
nhung n lai h tro mt phn rt dng k cho n. Nn tang Java d v dang
h tro rt nhiu cch khc nhau d lm vic voi XML trong thoi gian nht
dinh, v hu ht cc API c lin quan dn XML cua Java du duoc h tro
dy du trn Android. V du, Simple API cua Java cho XML (SAX) v
Document Object Model (DOM) hin du c sn trn Android. Nhiu nm
qua, ca hai API ny l mt phn cua cng ngh Java. San phm Streaming
API moi dy cho XML (StAX) hin chua c trong Android. Tuy nhin,
Android lai cung cp mt thu vin tuong duong v mt chuc nng. Diu
Cc t vit tt thng dng
API: Application
programming interface (Giao
din lp trnh ung dung)
RSS: Really Simple
Syndication (Giao thuc tp
hop thng tin don gian)
SDK: Software Developers
Kit (B dung cu cho nh pht
trin phm mm)
Page 1 of 12 Lm vic voi XML trn Android
cui cng l Java XML Binding API cung khng c sn trong Android.
Chc chn c th thuc hin API ny trong Android. Tuy nhin, n lai c xu
huong l mt API nng k, voi rt nhiu th hin khc nhau thuc cc lop
khc nhau thuong cn vic trnh by mt ti liu XML. Do vy m n khng
l tuong lm cho mt mi truong bi rng buc chng han nhu thit bi cm
tay m Android duoc thit k d chay trn d. Trong cc phn tip theo, ban
s ly mt ngun XML don gian c sn trn Internet, v xem cch phn tch
ngun d nhu th no trong pham vi mt ung dung Android su dung cc
API khc nhau duoc nhc dn o trn.Truoc tin, hy xem cc phn cn thit cua ung dung don gian s su dung XML
tu Internet.



Trnh dc tin Android
Ung dung s ly dim tin RSS tu trang nh pht trin Android ph bin Androidster v phn tch n thnh mt danh
sch cc di tuong Java don gian m ban c th su dung d quay lai Android ListView (xem Tai v d ly m ngun).
Dy l hoat dng da hnh thi c din tuc l cc thuc thi khc nhau (cc thut ton phn tch XML khc nhau) cung
cp hoat dng ging nhau. V du 1 cho ban thy ban c th m hnh ha diu ny d dng nhu th no trong m trnh
Java su dung mt giao din.

V d 1. giao din trnh phn tch dim tin XML

Trong V du 2, lop Message l mt POJO (Plain Old Java Object) c din miu ta mt cu trc du liu.

V d 2. Message POJO
UI: User interface (Giao din
nguoi dng)
URL: Universal Resource
Locator (Dia chi ti nguyn)
XML: Extensible Markup
Language (Ngn ngu dnh
du mo rng)
package og.deve1opeWoks.ando1d
1mpof ava.uf11.L1sf

pub11c 1nfeface IeedPase {
L1sf<Message> pase{}
}
pub11c c1ass Message 1mp1emenfs Compaab1e<Message>{
sfaf1c 51mp1eDafeIomaf IOkMA11Lk =
neW 51mp1eDafeIomaf{"LLL, dd MMM yyyy hh:mm:ss Z"}
p1vafe 5f1ng f1f1e
p1vafe ukL 11nk
p1vafe 5f1ng desc1pf1on
p1vafe Dafe dafe

// geffes and seffes om1ffed fo bev1fy
pub11c vo1d sefL1nk{5f1ng 11nk} {
fy {
fh1s.11nk = neW ukL{11nk}
} cafch {Ma1fomedukLLxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}

pub11c 5f1ng gefDafe{} {
efun IOkMA11Lk.fomaf{fh1s.dafe}
}

pub11c vo1d sefDafe{5f1ng dafe} {
// pad fhe dafe 1f necessay
Wh11e {!dafe.endsW1fh{"00"}}{
dafe += "0"
}
fy {
fh1s.dafe = IOkMA11Lk.pase{dafe.f1m{}}
} cafch {PaseLxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}

0Ove1de
pub11c 5f1ng fo5f1ng{} {
// om1ffed fo bev1fy
Page 2 of 12 Lm vic voi XML trn Android

Message, trong V du 2, thuong rt d lm. N n di mt vi trang thi bn trong cua mnh bng cch cho php truy
cp ngy thng v cc lin kt nhu cc chui don gian, trong khi th hin chng nhu cc di tuong duoc sp xp mt
cch r rng (mt java.util.Date v mt java.net.URL). N l mt Value Object (Di tuong Gi tri) c din, do
vy n thuc thi equals() v hashCode() dua trn trang thi bn trong cua n. N cung thuc hin giao din
Comparable v th ban c th su dung n d sp xp (theo ngy thng). Thuc t, du liu duoc phn loai tu dim tin,
do vy m diu ny khng cn thit.
Mi thuc thi trnh phn tch s cn dua mt URL dn dim tin Androidster v su dung ci ny d mo mt kt ni
HTTP dn trang Androidster. Hoat dng ph bin ny duoc m hnh ha mt cch tu nhin trong m trnh Java su
dung lop co so truu tuong nhu trong V du 3.

V d 3. Lp trnh phn tch dim tin co ban

Lop co so luu tru feedUrl v su dung n d mo java.io.InputStream. Nu c bt ky sai st no, don gian n tha
mt RuntimeException, sao cho ung dung dung hoat dng mt cch nhanh chng. Lop co so cung xc dinh mt vi
hng s don gian cho tn cc the. V du 4 trnh by mt s ni dung mu tu dim tin, qua d ban c th thy duoc
nghia cua cc the ny.

V d 4. Dim tin XML mu
}

0Ove1de
pub11c 1nf hashCode{} {
// om1ffed fo bev1fy
}

0Ove1de
pub11c boo1ean equa1s{Obecf ob} {
// om1ffed fo bev1fy
}
// sof by dafe
pub11c 1nf compae1o{Message anofhe} {
1f {anofhe == nu11} efun 1
// sof descend1ng, mosf ecenf f1sf
efun anofhe.dafe.compae1o{dafe}
}
}
pub11c absfacf c1ass 8aseIeedPase 1mp1emenfs IeedPase {

// names of fhe XML fags
sfaf1c f1na1 5f1ng Pu8DA1L = "pubDafe"
sfaf1c f1na1 5f1ng DL5CklP1lON = "desc1pf1on"
sfaf1c f1na1 5f1ng LlNk = "11nk"
sfaf1c f1na1 5f1ng 1l1LL = "f1f1e"
sfaf1c f1na1 5f1ng l1LM = "1fem"

f1na1 ukL feedu1

pofecfed 8aseIeedPase{5f1ng feedu1}{
fy {
fh1s.feedu1 = neW ukL{feedu1}
} cafch {Ma1fomedukLLxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}

pofecfed lnpuf5feam geflnpuf5feam{} {
fy {
efun feedu1.openConnecf1on{}.geflnpuf5feam{}
} cafch {lOLxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}
}
<?xm1 ves1on="1.0" encod1ng="u1I-"?>

<!-- geneafo="IeedCeafo 1.7.2" -->

<ss ves1on="2.0">

Page 3 of 12 Lm vic voi XML trn Android

Nhu ban c th thy tu mu trong V du 4, mt ITEM tuong duong voi mt th hin Message. Cc nt con cua muc
chon (TITLE, LINK v v.v..) tuong duong cc dc tnh cua th hin Message. V ban bit dim tin trng nhu th no
ri v c sn tt ca cc phn ph bin, hy xem lm th no d phn tch dim tin ny su dung cc cng ngh khc
nhau c sn trn Android. Ban s bt du voi SAX.



S dng SAX
Trong mi truong Java, ban c th thuong xuyn su dung SAX API khi ban mun c mt trnh phn tch nhanh v
mun han ch ti da vic su dung (footprint) b nho ung dung cua ban. Diu d khin cho cho n rt ph hop cho thit
bi di dng chay Android. Ban c th su dung SAX API nhu l tu mi truong Java, m khng cn dn nhung thay di
dc bit cn thit d chay trn Android.V du 5 trnh by mt thuc thi SAX cua giao din FeedParser.

V d 5. Thc thi SAX
<channe1>

<f1f1e>ando1dneWs</f1f1e>

<desc1pf1on>ando1dneWs</desc1pf1on>

<11nk>hffp://WWW.ando1dsfe.com/ando1dneWs.php</11nk>

<1asf8u11dDafe>5un, 19 Ap 2009 19:43:45 +0100</1asf8u11dDafe>

<geneafo>IeedCeafo 1.7.2</geneafo>

<1fem>

<f1f1e>5amsung 5000 fo kun Ando1d, P1ay D1vX, 1ake Ove fhe
Wo1d</f1f1e>

<11nk>hffp://WWW.ando1dsfe.com/ando1dneWs/samsung-s000-fo-un-ando1d-
p1ay-d1vx-fake-ove-fhe-Wo1d</11nk>

<desc1pf1on>Moe defa11s have emeged on fhe f1sf 5amsung handsef
fo un Ando1d. A yef-fo-be announced phone ca11ed fhe 5000 1s be1ng
epofed ...</desc1pf1on>

<pubDafe>1hu, 16 Ap 2009 07:1:51 +0100</pubDafe>

</1fem>

<1fem>

<f1f1e>Ando1d Cupcake updafe on fhe ho1zon</f1f1e>

<11nk>hffp://WWW.ando1dsfe.com/ando1dneWs/ando1d-cupcake-updafe-
on-fhe-ho1zon</11nk>

<desc1pf1on>Affe monfhs of d1scovey and heasay, fhe Ando1d
bu11d fhaf We have a11 been Wa1f1ng fo 1s abouf fo f1na11y make 1f
ouf ...</desc1pf1on>

<pubDafe>1ue, 14 Ap 2009 04:13:21 +0100</pubDafe>

</1fem>

</channe1>

</ss>
pub11c c1ass 5axIeedPase exfends 8aseIeedPase {

pofecfed 5axIeedPase{5f1ng feedu1}{
supe{feedu1}
}

pub11c L1sf<Message> pase{} {
5AXPaseIacfoy facfoy = 5AXPaseIacfoy.neWlnsfance{}
fy {
5AXPase pase = facfoy.neW5AXPase{}
ksshand1e hand1e = neW ksshand1e{}
Page 4 of 12 Lm vic voi XML trn Android

Nu truoc dy ban d su dung SAX, th ci ny trng cung kh quen thuc. Nhu voi bt ky thuc thi SAX no, phn lon
cc chi tit du nm trong trnh xu l SAX. Trnh xu l nhn cc su kin tu trnh phn tch SAX khi n chay nhanh
qua ti liu XML. Trong truong hop ny, ban vua tao ra mt lop moi goi l RssHandler v dng k n nhu l mt
trnh xu l cho trnh phn tch, nhu trong V du 6.

V d 6. Trnh xu l SAX

Lop RssHandler mo rng lop org.xml.sax.helpers.DefaultHandler. Lop ny cung cp cc thuc thi mc
dinh, khng thao tc cho tt ca cc phuong thuc tuong tu cc su kin duoc tao ra boi trnh phn tch SAX. Diu ny
cho php cc lop con chi ghi chn ln cc phuong thuc khi cn thit. RssHandler c mt API b sung,
getMessages. Ci ny tra v danh sch cc di tuong Message m trnh xu l thu thp duoc khi n nhn cc su kin
tu trnh phn tch SAX. N c hai bin trong khc, mt l currentMessage cho th hin Message dang duoc phn
tch, v mt l bin StringBuilder goi l builder luu tru du liu k tu tu cc nt vn ban. Cc bin ny du duoc
pase.pase{fh1s.geflnpuf5feam{}, hand1e}
efun hand1e.gefMessages{}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}
}
1mpof sfaf1c og.deve1opeWoks.ando1d.8aseIeedPase."

pub11c c1ass ksshand1e exfends Defau1fhand1e{
p1vafe L1sf<Message> messages
p1vafe Message cuenfMessage
p1vafe 5f1ng8u11de bu11de

pub11c L1sf<Message> gefMessages{}{
efun fh1s.messages
}
0Ove1de
pub11c vo1d chaacfes{cha|] ch, 1nf sfaf, 1nf 1engfh}
fhoWs 5AXLxcepf1on {
supe.chaacfes{ch, sfaf, 1engfh}
bu11de.append{ch, sfaf, 1engfh}
}

0Ove1de
pub11c vo1d endL1emenf{5f1ng u1, 5f1ng 1oca1Name, 5f1ng name}
fhoWs 5AXLxcepf1on {
supe.endL1emenf{u1, 1oca1Name, name}
1f {fh1s.cuenfMessage != nu11}{
1f {1oca1Name.equa1slgnoeCase{1l1LL}}{
cuenfMessage.sef11f1e{bu11de.fo5f1ng{}}
} e1se 1f {1oca1Name.equa1slgnoeCase{LlNk}}{
cuenfMessage.sefL1nk{bu11de.fo5f1ng{}}
} e1se 1f {1oca1Name.equa1slgnoeCase{DL5CklP1lON}}{
cuenfMessage.sefDesc1pf1on{bu11de.fo5f1ng{}}
} e1se 1f {1oca1Name.equa1slgnoeCase{Pu8DA1L}}{
cuenfMessage.sefDafe{bu11de.fo5f1ng{}}
} e1se 1f {1oca1Name.equa1slgnoeCase{l1LM}}{
messages.add{cuenfMessage}
}
bu11de.sefLengfh{0}
}
}

0Ove1de
pub11c vo1d sfafDocumenf{} fhoWs 5AXLxcepf1on {
supe.sfafDocumenf{}
messages = neW AayL1sf<Message>{}
bu11de = neW 5f1ng8u11de{}
}

0Ove1de
pub11c vo1d sfafL1emenf{5f1ng u1, 5f1ng 1oca1Name, 5f1ng name,
Aff1bufes aff1bufes} fhoWs 5AXLxcepf1on {
supe.sfafL1emenf{u1, 1oca1Name, name, aff1bufes}
1f {1oca1Name.equa1slgnoeCase{l1LM}}{
fh1s.cuenfMessage = neW Message{}
}
}
}
Page 5 of 12 Lm vic voi XML trn Android
bt du khi phuong thuc startDocument duoc dn ra khi trnh phn tch gui su kin tuong ung cho trnh xu l.
Hy xem phuong thuc startElement trong V du 6. Phuong thuc ny duoc goi mi khi bt gp the mo trong ti liu
XML. Ban chi cn quan tm khi no the d l the ITEM. Trong truong hop d, ban tao ra mt Message moi. By gio
hy nhn vo phuong thuc characters. Phuong thuc ny duoc goi ra khi bt gp du liu k tu tu cc nt vn ban. Du
liu d dng duoc thm vo bin builder. Cui cng hy xem phuong thuc endElement. Phuong thuc ny duoc goi
ra khi bt gp the kt thc. Di voi cc the tuong ung voi cc dc tnh cua mt Message, ging nhu TITLE v LINK,
dc tnh thch hop duoc thit dt trn currentMessage su dung du liu tu bin builder. Nu the kt thc l mt
ITEM, th currentMessage thm vo danh sch Messages. Dy l su phn tch SAX rt din hnh; o dy khng c g
l duy nht di voi Android. V th nu ban bit cch vit mt trnh phn tch SAX Java, th ban bit cch vit mt
trnh phn tch SAX Android. Tuy nhin, Android SDK c b sung thm mt s tnh nng thun tin vo SAX.



Phn tch SAX d dng hon
Android SDK c chua mt lop tin ch duoc goi l android.util.Xml. V du 7 trnh by cch ci dt mt trnh phn
tch SAX voi cng lop tin ch nhu th.

V d 7. Trnh phn tch SAX Android

Luu l lop ny vn su dung trnh xu l SAX chun, v don gian ban d su dung lai RssHandler nhu trong V du 7 o
trn. Vic c th su dung lai trnh xu l SAX rt tt, nhung n vn c di cht phuc tap v m trnh. Ban c tuong
tuong, nu ban phai phn tch mt ti liu XML phuc tap hon rt nhiu, trnh phn tch c th tro thnh manh dt mu
m cho cc li. V du, hy xem lai phuong thuc endElement trong V du 6. Luu cch phuong thuc ny kim tra
nhu th no nu currentMessage c gi tri khng truoc khi n c ci dt cc thuc tnh? By gio hy nhn vo XML
mu trong V du 4. Luu rng c cc the TITLE v LINK nm ngoi cc the ITEM. D l l do tai sao kim tra gi tri
khng duoc dua vo. Nu khng th the TITLE du tin c th gy ra mt NullPointerException. Android bao
gm ca bin th SAX API cua chnh n (xem V du 8) loai bo yu cu ban phai vit trnh xu l SAX cua chnh ban.

V d 8. Trnh phn tch SAX Android don gian
pub11c c1ass Ando1d5axIeedPase exfends 8aseIeedPase {

pub11c Ando1d5axIeedPase{5f1ng feedu1} {
supe{feedu1}
}

pub11c L1sf<Message> pase{} {
ksshand1e hand1e = neW ksshand1e{}
fy {
Xm1.pase{fh1s.geflnpuf5feam{}, Xm1.Lncod1ng.u1I, hand1e}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
efun hand1e.gefMessages{}
}

}
pub11c c1ass Ando1d5axIeedPase exfends 8aseIeedPase {

pub11c Ando1d5axIeedPase{5f1ng feedu1} {
supe{feedu1}
}

pub11c L1sf<Message> pase{} {
f1na1 Message cuenfMessage = neW Message{}
koofL1emenf oof = neW koofL1emenf{"ss"}
f1na1 L1sf<Message> messages = neW AayL1sf<Message>{}
L1emenf channe1 = oof.gefCh11d{"channe1"}
L1emenf 1fem = channe1.gefCh11d{l1LM}
1fem.sefLndL1emenfL1sfene{neW LndL1emenfL1sfene{}{
pub11c vo1d end{} {
messages.add{cuenfMessage.copy{}}
}
}}
Page 6 of 12 Lm vic voi XML trn Android

Nhu d hua, m phn tch SAX moi khng su dung trnh xu l SAX. Thay vo d n su dung cc lop tu gi
android.sax trong SDK. Cc lop ny cho php ban m hnh ha cu trc cua ti liu XML cua ban v thm mt trnh
nghe su kin nu cn. Trong m trnh trn, ban khai bo rng ti liu cua ban s c mt phn tu gc c tn rss v rng
phn tu ny s c ba phn tu con l channel. Tip dn ban ni rng channel s c ba phn tu con duoc goi l ITEM
v ban bt du gn cc trnh nghe. Di voi mi trnh nghe, ban d su dung mt lop bn trong v danh d thuc hin giao
din ban quan tm (hoc EndElementListner hoc EndTextElementListener). Ch khng cn phai theo di
du liu k tu. Vic ny khng chi don gian hon m thuc su cn hiu qua hon. Cui cng, khi ban goi dn phuong thuc
tin ch Xml.parse, by gio ban dua vo trnh xu l duoc tao ra tu phn tu gc.
Ton b m trnh o trn trong V du 8 thuc loai ty chon. Nu ban thy thoai mi voi m trnh phn tch SAX chun
trong mi truong Java, th ban c th tch vo d. Nu ban mun thu cc trnh bao boc tin loi do Android SDK cung
cp, ban cung c th su dung n. Nu ban khng mun su dung SAX th sao dy? Vn cn c mt vi lua chon khc.
Lua chon du tin ban s thy d l DOM.



Lm vic DOM
DOM phn tch trn Android duoc h tro hon ton. N lm vic chnh xc nhu khi n lm vic trong m trnh Java
m ban s chay trn my tnh d bn hoc trn mt my chu. V du 9 trnh by mt thuc thi dua trn DOM cua giao
din trnh phn tch.

V d 9. Thc thi da trn DOM cua mt trnh phn tch dim tin
1fem.gefCh11d{1l1LL}.sefLnd1exfL1emenfL1sfene{neW Lnd1exfL1emenfL1sfene{}{
pub11c vo1d end{5f1ng body} {
cuenfMessage.sef11f1e{body}
}
}}
1fem.gefCh11d{LlNk}.sefLnd1exfL1emenfL1sfene{neW Lnd1exfL1emenfL1sfene{}{
pub11c vo1d end{5f1ng body} {
cuenfMessage.sefL1nk{body}
}
}}
1fem.gefCh11d{DL5CklP1lON}.sefLnd1exfL1emenfL1sfene{neW
Lnd1exfL1emenfL1sfene{}{
pub11c vo1d end{5f1ng body} {
cuenfMessage.sefDesc1pf1on{body}
}
}}
1fem.gefCh11d{Pu8DA1L}.sefLnd1exfL1emenfL1sfene{neW Lnd1exfL1emenfL1sfene{}{
pub11c vo1d end{5f1ng body} {
cuenfMessage.sefDafe{body}
}
}}
fy {
Xm1.pase{fh1s.geflnpuf5feam{}, Xm1.Lncod1ng.u1I,
oof.gefConfenfhand1e{}}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
efun messages
}
}
pub11c c1ass DomIeedPase exfends 8aseIeedPase {

pofecfed DomIeedPase{5f1ng feedu1} {
supe{feedu1}
}

pub11c L1sf<Message> pase{} {
Documenf8u11deIacfoy facfoy = Documenf8u11deIacfoy.neWlnsfance{}
L1sf<Message> messages = neW AayL1sf<Message>{}
fy {
Documenf8u11de bu11de = facfoy.neWDocumenf8u11de{}
Documenf dom = bu11de.pase{fh1s.geflnpuf5feam{}}
L1emenf oof = dom.gefDocumenfL1emenf{}
NodeL1sf 1fems = oof.gefL1emenfs8y1agName{l1LM}
fo {1nf 1=01<1fems.gefLengfh{}1++}{
Message message = neW Message{}
Page 7 of 12 Lm vic voi XML trn Android

Ging nhu v du SAX du tin, khng c g l cu th di voi Android v m trnh ny. Trnh phn tch DOM doc tt ca
cc ti liu XML vo b nho ri sau d cho php ban su dung cc DOM API d chay ngang qua cy XML, truy vn du
liu m ban mun. Dy l m trnh rt d lm, v, trong mt s cch, cn don gian hon ca cc thuc thi dua trn SAX.
Tuy nhin, thng thuong DOM tiu tn nhiu b nho hon v truoc tin moi thu du duoc doc vo b nho. Diu ny c
th l mt vn d trn thit bi di dng chay Android, nhung n c th dp ung duoc trong mt vi truong hop su dung
nht dinh m dung luong ti liu XML s khng bao gio qu lon. C th diu ny ngu rng cc nh pht trin
Android d don rng trnh phn tch SAX s ph bin hon rt nhiu trn cc ung dung Android, do d cc tin ch b
sung duoc cung cp cho n. Mt loai trnh phn tch XML khc cung c trn Android, v d l trnh phn tch ko.



Trnh phn tch ko XML
Nhu d d cp trong cc phn truoc, Android khng cung cp h tro cho StAX API cua Java. Tuy nhin Android lai di
km voi mt trnh phn tch ko lm vic tuong tu nhu StAX. N cho php m ung dung cua ban ko hoc tm kim
cc su kin tu trnh phn tch, tri nguoc voi trnh phn tch SAX tu dng dy cc su kin cho trnh xu l. V du 10
miu ta mt thuc thi trnh phn tch ko cua mt giao din trnh phn tch dim tin.

V d 10. Thc thi da trn trnh phn tch ko
Node 1fem = 1fems.1fem{1}
NodeL1sf popef1es = 1fem.gefCh11dNodes{}
fo {1nf =0<popef1es.gefLengfh{}++}{
Node popefy = popef1es.1fem{}
5f1ng name = popefy.gefNodeName{}
1f {name.equa1slgnoeCase{1l1LL}}{
message.sef11f1e{popefy.gefI1sfCh11d{}.gefNodeva1ue{}}
} e1se 1f {name.equa1slgnoeCase{LlNk}}{
message.sefL1nk{popefy.gefI1sfCh11d{}.gefNodeva1ue{}}
} e1se 1f {name.equa1slgnoeCase{DL5CklP1lON}}{
5f1ng8u11de fexf = neW 5f1ng8u11de{}
NodeL1sf chas = popefy.gefCh11dNodes{}
fo {1nf k=0k<chas.gefLengfh{}k++}{
fexf.append{chas.1fem{k}.gefNodeva1ue{}}
}
message.sefDesc1pf1on{fexf.fo5f1ng{}}
} e1se 1f {name.equa1slgnoeCase{Pu8DA1L}}{
message.sefDafe{popefy.gefI1sfCh11d{}.gefNodeva1ue{}}
}
}
messages.add{message}
}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
efun messages
}
}
pub11c c1ass Xm1Pu11IeedPase exfends 8aseIeedPase {
pub11c Xm1Pu11IeedPase{5f1ng feedu1} {
supe{feedu1}
}
pub11c L1sf<Message> pase{} {
L1sf<Message> messages = nu11
Xm1Pu11Pase pase = Xm1.neWPu11Pase{}
fy {
// aufo-defecf fhe encod1ng fom fhe sfeam
pase.seflnpuf{fh1s.geflnpuf5feam{}, nu11}
1nf evenf1ype = pase.gefLvenf1ype{}
Message cuenfMessage = nu11
boo1ean done = fa1se
Wh11e {evenf1ype != Xm1Pu11Pase.LNDDOCuMLN1 && !done}{
5f1ng name = nu11
sW1fch {evenf1ype}{
case Xm1Pu11Pase.51Ak1DOCuMLN1:
messages = neW AayL1sf<Message>{}
beak
case Xm1Pu11Pase.51Ak11AG:
name = pase.gefName{}
1f {name.equa1slgnoeCase{l1LM}}{
cuenfMessage = neW Message{}
} e1se 1f {cuenfMessage != nu11}{
Page 8 of 12 Lm vic voi XML trn Android

Trnh phn tch ko lm vic tuong tu nhu trnh phn tch SAX. N c cc su kin tuong tu (phn tu bt du, phn tu
kt thc) nhung ban phai ko tu chng (parser.next()). Cc su kin duoc gui di duoi dang cc m s, v th ban
c th su dung mt case-switch don gian. Ch , thay v nghe cho dn khi kt thc cc phn tu nhu trong phn tch
SAX, voi trnh phn tch ko, tht d dng tin hnh hu ht cc xu l ngay tu du. Trong m trnh trong V du 10, khi
mt phn tu bt du, ban c th goi dn parser.nextText() d ko tt ca du liu k tu tu ti liu XML. Diu ny
mang dn mt su don gian ha tt cho phn tch SAX. Cung cn ch rng ban dt mt co (bin boolean done) d
nhn bit khi no ban dn phn kt thc ni dung m ban quan tm. Diu ny cho php ban som tam dung vic doc ti
liu XML, v ban bit rng m trnh s khng quan tm dn phn cn lai cua ti liu. Diu ny c th rt huu ch, dc
bit nu ban chi cn mt phn nho ti liu dang duoc truy cp. Ban c th giam dng k thoi gian phn tch bng cch
dung vic phn tch cng som cng tt. Hon nua, kiu ti uu ha ny dc bit quan trong trn thit bi di dng noi tc
d kt ni c th chm. Trnh phn tch ko c mt vi uu dim v hiu nng cung nhu uu dim su dung d dng.
Cung c th su dung n d vit XML.



Tao XML
Dn tn by gio, ti vn d v dang tp trung phn tch XML tu Internet. Tuy nhin, thinh thoang ung dung cua ban
cn gui XML toi mt my chu o xa. Hin nhin ban c th su dung mt StringBuilder hoc ci g d tuong tu d
tao ra mt chui XML. Mt thay th khc nua bt ngun tu trnh phn tch ko trong V du 11.

V d 11. Vit XML bng trnh phn tch ko
1f {name.equa1slgnoeCase{LlNk}}{
cuenfMessage.sefL1nk{pase.nexf1exf{}}
} e1se 1f {name.equa1slgnoeCase{DL5CklP1lON}}{
cuenfMessage.sefDesc1pf1on{pase.nexf1exf{}}
} e1se 1f {name.equa1slgnoeCase{Pu8DA1L}}{
cuenfMessage.sefDafe{pase.nexf1exf{}}
} e1se 1f {name.equa1slgnoeCase{1l1LL}}{
cuenfMessage.sef11f1e{pase.nexf1exf{}}
}
}
beak
case Xm1Pu11Pase.LND1AG:
name = pase.gefName{}
1f {name.equa1slgnoeCase{l1LM} &&
cuenfMessage != nu11}{
messages.add{cuenfMessage}
} e1se 1f {name.equa1slgnoeCase{ChANNLL}}{
done = fue
}
beak
}
evenf1ype = pase.nexf{}
}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
efun messages
}
}
p1vafe 5f1ng W1feXm1{L1sf<Message> messages}{
Xm15e1a11ze se1a11ze = Xm1.neW5e1a11ze{}
5f1ngW1fe W1fe = neW 5f1ngW1fe{}
fy {
se1a11ze.sefOufpuf{W1fe}
se1a11ze.sfafDocumenf{"u1I-", fue}
se1a11ze.sfaf1ag{"", "messages"}
se1a11ze.aff1bufe{"", "numbe", 5f1ng.va1ueOf{messages.s1ze{}}}
fo {Message msg: messages}{
se1a11ze.sfaf1ag{"", "message"}
se1a11ze.aff1bufe{"", "dafe", msg.gefDafe{}}
se1a11ze.sfaf1ag{"", "f1f1e"}
se1a11ze.fexf{msg.gef11f1e{}}
se1a11ze.end1ag{"", "f1f1e"}
se1a11ze.sfaf1ag{"", "u1"}
se1a11ze.fexf{msg.gefL1nk{}.foLxfena1Iom{}}
se1a11ze.end1ag{"", "u1"}
se1a11ze.sfaf1ag{"", "body"}
Page 9 of 12 Lm vic voi XML trn Android

Lop XmlSerializer l mt phn trong gi ging nhu XmlPullParser duoc dng trong phn truoc. Thay v ko
vo cc su kin, n dy chng ra dn mt lung hoc mt b ghi. Trong truong hop ny, n d dng dy chng sang
mt th hin java.io.StringWriter. N cung cp mt API don gian cng voi cc phuong thuc d bt du v kt
thc mt ti liu, xu l cc phn tu v thm vn ban hoc cc thuc tnh. Dy c th l mt lua chon thay th kh tt
cho vic su dung mt StringBuilder, v d dng dam bao XML cua ban chun xc.



Tng kt
Loai ung dung no ban mun xy dung cho cc thit bi Android? D l loai no di nua, nu n cn lm vic voi du
liu tu Internet, th c th n cn phai lm vic voi XML. Trong bi vit ny, ban d thy rng Android duoc tch hop
di cng voi rt nhiu cng cu xu l XML. Ban c th chon ly mt trong cc cng cu d nhu l cng-cu-lua-chon cua
ban, hoc ban c th lua chon cn cu vo truong hop su dung. Thng thuong su lua chon an ton l chon cng voi
SAX, v Android cung cp cho ban ca cch truyn thng d thuc hin SAX v mt trnh bao boc tin loi kho lo trn
ca SAX. Nu ti liu cua ban nho, th c l DOM l cch don gian hon nn theo. Nu ti liu cua ban lon, nhung ban
chi cn mt phn ti liu, th trnh phn tch ko XML c l l cch hiu qua hon nn theo. Cui cng, d vit XML,
gi trnh phn tch ko cung cung cp mt cch thun tin d lm vic d. V th, ci m XML cua ban cn c l g di
nua, th Android SDK vn c cho ban.




Ti v


Ti nguyn
Hc tp
Develop Android applications with Eclipse (Frank Ableson,developerWorks, 02/2008): Cch d dng nht d
pht trin cc ung dung Android l su dung Eclipse. Hy tm hiu tt ca diu ny trong bi huong dn ny.

Using integrated packages: Codehaus' Woodstox (Michael Galpin, developerWorks, 07/2007): Dnh cho so
snh khc cua SAX, DOM, v trnh phn tch ko, hy doc bi vit ny.

StAX'ing up XML, Part 2: Pull parsing and events (Peter Nehrer, developerWorks, December 2006): Ci nhn
su hon v trnh phn tch ko XML.

Understanding SAX (Nicholas Chase, developerWorks, 07/2003): Tro thnh chuyn gia v phn tch SAX voi
bi huong dn ny.
se1a11ze.fexf{msg.gefDesc1pf1on{}}
se1a11ze.end1ag{"", "body"}
se1a11ze.end1ag{"", "message"}
}
se1a11ze.end1ag{"", "messages"}
se1a11ze.endDocumenf{}
efun W1fe.fo5f1ng{}
} cafch {Lxcepf1on e} {
fhoW neW kunf1meLxcepf1on{e}
}
}
Tn Kch thuc Phuong thc tai
AndroidXml.zip 70KB
HTTP
Thng tin v phuong thuc tai
Page 10 of 12 Lm vic voi XML trn Android
IBM, logo IBM, ibm.com, DB2, developerWorks, Lotus, Rational, Tivoli, v WebSphere l cc thuong hiu hoc thuogn

Understanding DOM (Nicholas Chase, developerWorks, 03/2007): D hiu thm v trnh phn tch, hy doc bi
huong dn ny.

Ti liu Android SDK: Tm hiu b cng cu ny d pht trin v sua li m ung dung v thit k mt UI ung
dung.

Open Handset Alliance: Tm kim nh ti tro cho Android, mt nhm 47 cng ty cng ngh v di dng lm vic
d dy nhanh tc d di moi trong cng ngh di dng.

Chung chi XML cua IBM: Tm hiu xem lm th no m ban c th tro thnh mt Nh pht trin c chung chi
IBM trong XML v cc cng ngh lin quan.

Thu vin k thut XML: Xem khu vuc developerWorks XML noi c rt nhiu cc bi vit chuyn mn v cc
meo nho, bi huong dn, cc tiu chun v Sch do IBM.

Cc su kin k thut WebdeveloperWorks v web quang b: Lm quen voi cng ngh trong cc phin ny.

developerWorks podcast: Nghe cc bi phong vn th vi v cc cuc thao lun dnh cho cc nh pht trin phn
mm.

Ly san phm v cng ngh
Android SDK: Tai v, truy cp tham chiu API, v nhn tin tuc moi nht v Android tu trang web chnh thuc
cua cc nh pht trin Android.

Du n M ngun Mo Android: Ly m ngun mo cho Android.

Eclipse IDE: Ly phin ban moi nht v cho n hoat dng.

Cc phin ban dnh gi san phm IBM: Tai v hoc su dung cc ban thu nghim truc tuyn trong IBM SOA
Sandbox v bt du su dung cc cng cu pht trin ung dung v cc san phm phn mm trung gian tu DB2,
Lotus, Rational, Tivoli, v WebSphere.


Thao lun
Tham gia din dn thao lun.

Cc din dn thao lun v XML: Tham gia mt s cuc thao lun v XML.

developerWorks blogs: Doc cc blog ny v tham gia vo cng dng developerWorks.



i nt v tc gi







Michael Galpin d pht trin phn mm Java mt cch chuyn nghip tu nm 1998. ng hin dang lm vic cho
eBay. ng d c bng v ton hoc cua Vin Cng ngh California.
Page 11 of 12 Lm vic voi XML trn Android
hiu d duoc dng k cua International Business Machines Corporation tai M v cc quc gia khc. Cc thuong hiu ny
v cc diu khoan duoc dng k thuong hiu IBM xut hin ln du tin trong bi vit ny di km voi biu tuong ph hop
( hoc ), chi ra rng dy l cc thuong hiu d duoc dng k tai M hoc thuc so huu hop php cua IBM khi bi vit
ny duoc pht hnh. Cc thuong hiu ny cung c th duoc dng k hoc l thuong hiu hop php tai cc quc gia khc.
Hy xem danh sch hin c v cc thuong hiu IBM. Adobe, logo Adobe, PostScript, v logo PostScript hoc l thuong
hiu duoc dng k hoc l thuong hiu cua Adobe Systems Incorporated tai M v/hoc cc quc gia khc. Java v tt ca
cc thuong hiu dua trn Java du l thuong hiu cua Sun Microsystems, Inc. tai M v/hoc cc quc ga khc. Cc tn
dich vu, cng ty hoc san phm khc c th l thuong hiu hoc dich vu cua cc cng ty khc. Tn cua cng ty, san phm
hay dich vu c th l nhn hiu dng k hoc nhn hiu dich vu cua nguoi khc.
Page 12 of 12 Lm vic voi XML trn Android

You might also like