You are on page 1of 16

Copyright IBM Corporation 2010 Nhn hiu ng k

Lm vic vi XML trn Android Trang 1 ca 16


Lm vic vi XML trn Android
Xy dng cc ng dng Java cho cc thit b di ng
Michael Galpin
Kin trc s phn mm
Ludi Labs
08 01 2010
Android l mt h iu hnh ngun m, hin i v l SDK cho cc thit b di ng. Vi h iu
hnh ny, bn c th to ra cc ng dng di ng rt mnh. iu ny thm ch cn tr nn hp
dn hn na khi cc ng dng ca bn c th truy cp cc dch v Web, c ngha l bn cn s
dng ngn ng ca Web l: XML. Trong bi vit ny, bn s thy nhiu la chn khc nhau
lm vic vi XML trn Android v cch s dng chng xy dng cc ng dng Android ca
chnh bn.
Bt u
Trong bi vit ny, bn hc cch xy dng cc ng dng Android c th lm vic vi XML t
Internet. Cc ng dng Android c vit bng ngn ng lp trnh Java, do vy m kinh nghim
lm vic vi cng ngh Java l iu cn phi c. pht trin cho Android, bn s cn n Android
SDK. Ton b m trnh c trnh by trong bi vit ny s lm vic vi bt k phin bn no ca
Android SDK, nhng phin bn SDK 1.5_pre c s dng pht trin m trnh. Bn c th
pht trin cc ng dng Android ch vi SDK v mt trnh bin tp vn bn l , nhng s d dng
hn nhiu nu s dng Android Developer Tools (ADT), l mt trnh b sung Eclipse. i vi bi
vit ny, phin bn 0.9 ca ADT c dng vi Eclipse 3.4.2, mt phin bn Java. Xem Ti
nguyn ly cc lin kt dn n tt c cc cng c ny.
XML trn Android
Nn tng Android l mt nn tng pht trin di ng m ngun m. N gip bn truy cp vo tt c
cc kha cnh ca thit b di ng m n chy trn , t cc ha cp thp, n phn cng nh
l thit b camera trn in thoi. Vi rt nhiu th c th s dng Android, c th bn s t hi ti
sao bn cn phin n XML. khng phi v lm vic vi XML rt th v; m l n ang lm vic
vi nhng th m n kch hot. XML thng c dng nh l mt nh dng d liu trn Internet.
Nu bn mun truy cp d liu t Internet, cc kh nng c th l d liu s dng XML. Nu bn
mun gi d liu n mt dch v Web, c th bn cng cn gi c d liu XML. Ni ngn gn l
nu ng dng Android ca bn thc y Internet, th c th bn s cn phi lm vic vi XML. Tht
may mn l bn c rt nhiu la chn c sn lm vic vi XML trn Android.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 2 ca 16
Cc trnh phn tch XML
Cc t vit tt thng dng
API: Application programming interface (Giao din lp trnh ng dng)
RSS: Really Simple Syndication (Giao thc tp hp thng tin n gin)
SDK: Software Developers Kit (B dng c cho nh pht trin phm mm)
UI: User interface (Giao din ngi dng)
URL: Universal Resource Locator (a ch ti nguyn)
XML: Extensible Markup Language (Ngn ng nh du m rng)
Mt trong nhn u im ln nht ca nn tng Android chnh l vic n thc y ngn ng lp trnh
Java. Android SDK khng hon ton cung cp sn mi th cho Mi trng Thi gian chy Java
(JRE) chun ca bn, nhng n li h tr mt phn rt ng k cho n. Nn tng Java v ang
h tr rt nhiu cch khc nhau lm vic vi XML trong thi gian nht nh, v hu ht cc API
c lin quan n XML ca Java u c h tr y trn Android. V d, Simple API ca Java
cho XML (SAX) v Document Object Model (DOM) hin u c sn trn Android. Nhiu nm qua,
c hai API ny l mt phn ca cng ngh Java. Sn phm Streaming API mi y cho XML (StAX)
hin cha c trong Android. Tuy nhin, Android li cung cp mt th vin tng ng v mt chc
nng. iu cui cng l Java XML Binding API cng khng c sn trong Android. Chc chn c th
thc hin API ny trong Android. Tuy nhin, n li c xu hng l mt API nng k, vi rt nhiu
th hin khc nhau thuc cc lp khc nhau thng cn vic trnh by mt ti liu XML. Do vy m
n khng l tng lm cho mt mi trng b rng buc chng hn nh thit b cm tay m Android
c thit k chy trn . Trong cc phn tip theo, bn s ly mt ngun XML n gin c sn
trn Internet, v xem cch phn tch ngun nh th no trong phm vi mt ng dng Android
s dng cc API khc nhau c nhc n trn.Trc tin, hy xem cc phn cn thit ca ng
dng n gin s s dng XML t Internet.
Trnh c tin Android
ng dng s ly im tin RSS t trang nh pht trin Android ph bin Androidster v phn tch
n thnh mt danh sch cc i tng Java n gin m bn c th s dng quay li Android
ListView (xem Ti v ly m ngun). y l hot ng a hnh thi c in tc l cc thc thi
khc nhau (cc thut ton phn tch XML khc nhau) cung cp hot ng ging nhau. V d 1 cho
bn thy bn c th m hnh ha iu ny d dng nh th no trong m trnh Java s dng mt
giao din.
V d 1. giao din trnh phn tch im tin XML
package org.developerworks.android;
import java.util.List;
public interface FeedParser {
List<Message> parse();
}
Trong V d 2, lp Message l mt POJO (Plain Old Java Object) c in miu t mt cu trc d
liu.
V d 2. Message POJO
public class Message implements Comparable<Message>{
static SimpleDateFormat FORMATTER =
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 3 ca 16
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;
// getters and setters omitted for brevity
public void setLink(String link) {
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public String getDate() {
return FORMATTER.format(this.date);
}
public void setDate(String date) {
// pad the date if necessary
while (!date.endsWith("00")){
date += "0";
}
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Override
public String toString() {
// omitted for brevity
}
@Override
public int hashCode() {
// omitted for brevity
}
@Override
public boolean equals(Object obj) {
// omitted for brevity
}
// sort by date
public int compareTo(Message another) {
if (another == null) return 1;
// sort descending, most recent first
return another.date.compareTo(date);
}
}
Message, trong V d 2, thng rt d lm. N n i mt vi trng thi bn trong ca mnh bng
cch cho php truy cp ngy thng v cc lin kt nh cc chui n gin, trong khi th hin chng
nh cc i tng c sp xp mt cch r rng (mt java.util.Date v mt java.net.URL).
N l mt Value Object (i tng Gi tr) c in, do vy n thc thi equals() v hashCode() da
trn trng thi bn trong ca n. N cng thc hin giao din Comparable v th bn c th s dng
n sp xp (theo ngy thng). Thc t, d liu c phn loi t im tin, do vy m iu ny
khng cn thit.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 4 ca 16
Mi thc thi trnh phn tch s cn a mt URL n im tin Androidster v s dng ci ny m
mt kt ni HTTP n trang Androidster. Hot ng ph bin ny c m hnh ha mt cch t
nhin trong m trnh Java s dng lp c s tru tng nh trong V d 3.
V d 3. Lp trnh phn tch im tin c bn
public abstract class BaseFeedParser implements FeedParser {
// names of the XML tags
static final String PUB_DATE = "pubDate";
static final String DESCRIPTION = "description";
static final String LINK = "link";
static final String TITLE = "title";
static final String ITEM = "item";
final URL feedUrl;
protected BaseFeedParser(String feedUrl){
try {
this.feedUrl = new URL(feedUrl);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
protected InputStream getInputStream() {
try {
return feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Lp c s lu tr feedUrl v s dng n m java.io.InputStream. Nu c bt k sai st no,
n gin n th mt RuntimeException, sao cho ng dng dng hot ng mt cch nhanh chng.
Lp c s cng xc nh mt vi hng s n gin cho tn cc th. V d 4 trnh by mt s ni
dung mu t im tin, qua bn c th thy c ngha ca cc th ny.
V d 4. im tin XML mu
<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.2" -->
<rss version="2.0">
<channel>
<title>android_news</title>
<description>android_news</description>
<link>http://www.androidster.com/android_news.php</link>
<lastBuildDate>Sun, 19 Apr 2009 19:43:45 +0100</lastBuildDate>
<generator>FeedCreator 1.7.2</generator>
<item>
<title>Samsung S8000 to Run Android, Play DivX, Take Over the
World</title>
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 5 ca 16
<link>http://www.androidster.com/android_news/samsung-s8000-to-run-android-
play-divx-take-over-the-world</link>
<description>More details have emerged on the first Samsung handset
to run Android. A yet-to-be announced phone called the S8000 is being
reported ...</description>
<pubDate>Thu, 16 Apr 2009 07:18:51 +0100</pubDate>
</item>
<item>
<title>Android Cupcake Update on the Horizon</title>
<link>http://www.androidster.com/android_news/android-cupcake-update-
on-the-horizon</link>
<description>After months of discovery and hearsay, the Android
build that we have all been waiting for is about to finally make it
out ...</description>
<pubDate>Tue, 14 Apr 2009 04:13:21 +0100</pubDate>
</item>
</channel>
</rss>
Nh bn c th thy t mu trong V d 4, mt ITEM tng ng vi mt th hin Message. Cc
nt con ca mc chn (TITLE, LINK v v.v..) tng ng cc c tnh ca th hin Message. V bn
bit im tin trng nh th no ri v c sn tt c cc phn ph bin, hy xem lm th no
phn tch im tin ny s dng cc cng ngh khc nhau c sn trn Android. Bn s bt u vi
SAX.
S dng SAX
Trong mi trng Java, bn c th thng xuyn s dng SAX API khi bn mun c mt trnh
phn tch nhanh v mun hn ch ti a vic s dng (footprint) b nh ng dng ca bn. iu
khin cho cho n rt ph hp cho thit b di ng chy Android. Bn c th s dng SAX API nh l
t mi trng Java, m khng cn n nhng thay i c bit cn thit chy trn Android.V d
5 trnh by mt thc thi SAX ca giao din FeedParser.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 6 ca 16
V d 5. Thc thi SAX
public class SaxFeedParser extends BaseFeedParser {
protected SaxFeedParser(String feedUrl){
super(feedUrl);
}
public List<Message> parse() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
RssHandler handler = new RssHandler();
parser.parse(this.getInputStream(), handler);
return handler.getMessages();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Nu trc y bn s dng SAX, th ci ny trng cng kh quen thuc. Nh vi bt k thc thi
SAX no, phn ln cc chi tit u nm trong trnh x l SAX. Trnh x l nhn cc s kin t trnh
phn tch SAX khi n chy nhanh qua ti liu XML. Trong trng hp ny, bn va to ra mt lp
mi gi l RssHandler v ng k n nh l mt trnh x l cho trnh phn tch, nh trong V d 6.
V d 6. Trnh x l SAX
import static org.developerworks.android.BaseFeedParser.*;
public class RssHandler extends DefaultHandler{
private List<Message> messages;
private Message currentMessage;
private StringBuilder builder;
public List<Message> getMessages(){
return this.messages;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
builder.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
super.endElement(uri, localName, name);
if (this.currentMessage != null){
if (localName.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(builder.toString());
} else if (localName.equalsIgnoreCase(LINK)){
currentMessage.setLink(builder.toString());
} else if (localName.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(builder.toString());
} else if (localName.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(builder.toString());
} else if (localName.equalsIgnoreCase(ITEM)){
messages.add(currentMessage);
}
builder.setLength(0);
}
}
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 7 ca 16
@Override
public void startDocument() throws SAXException {
super.startDocument();
messages = new ArrayList<Message>();
builder = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
if (localName.equalsIgnoreCase(ITEM)){
this.currentMessage = new Message();
}
}
}
Lp RssHandler m rng lp org.xml.sax.helpers.DefaultHandler. Lp ny cung cp cc thc
thi mc nh, khng thao tc cho tt c cc phng thc tng t cc s kin c to ra bi trnh
phn tch SAX. iu ny cho php cc lp con ch ghi chn ln cc phng thc khi cn thit.
RssHandler c mt API b sung, getMessages. Ci ny tr v danh sch cc i tng Message m
trnh x l thu thp c khi n nhn cc s kin t trnh phn tch SAX. N c hai bin trong khc,
mt l currentMessage cho th hin Message ang c phn tch, v mt l bin StringBuilder
gi l builder lu tr d liu k t t cc nt vn bn. Cc bin ny u c bt u khi phng
thc startDocument c dn ra khi trnh phn tch gi s kin tng ng cho trnh x l.
Hy xem phng thc startElement trong V d 6. Phng thc ny c gi mi khi bt gp th
m trong ti liu XML. Bn ch cn quan tm khi no th l th ITEM. Trong trng hp , bn
to ra mt Message mi. By gi hy nhn vo phng thc characters. Phng thc ny c gi
ra khi bt gp d liu k t t cc nt vn bn. D liu d dng c thm vo bin builder. Cui
cng hy xem phng thc endElement. Phng thc ny c gi ra khi bt gp th kt thc. i
vi cc th tng ng vi cc c tnh ca mt Message, ging nh TITLE v LINK, c tnh thch
hp c thit t trn currentMessage s dng d liu t bin builder. Nu th kt thc l mt
ITEM, th currentMessage thm vo danh sch Messages. y l s phn tch SAX rt in hnh;
y khng c g l duy nht i vi Android. V th nu bn bit cch vit mt trnh phn tch SAX
Java, th bn 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 hn
Android SDK c cha mt lp tin ch c gi l android.util.Xml. V d 7 trnh by cch ci t
mt trnh phn tch SAX vi cng lp tin ch nh th.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 8 ca 16
V d 7. Trnh phn tch SAX Android
public class AndroidSaxFeedParser extends BaseFeedParser {
public AndroidSaxFeedParser(String feedUrl) {
super(feedUrl);
}
public List<Message> parse() {
RssHandler handler = new RssHandler();
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, handler);
} catch (Exception e) {
throw new RuntimeException(e);
}
return handler.getMessages();
}
}
Lu l lp ny vn s dng trnh x l SAX chun, v n gin bn s dng li RssHandler
nh trong V d 7 trn. Vic c th s dng li trnh x l SAX rt tt, nhng n vn c i cht
phc tp v m trnh. Bn c tng tng, nu bn phi phn tch mt ti liu XML phc tp
hn rt nhiu, trnh phn tch c th tr thnh mnh t mu m cho cc li. V d, hy xem li
phng thc endElement trong V d 6. Lu cch phng thc ny kim tra nh th no nu
currentMessage c gi tr khng trc khi n c ci t cc thuc tnh? By gi hy nhn vo
XML mu trong V d 4. Lu rng c cc th TITLE v LINK nm ngoi cc th ITEM. l l do
ti sao kim tra gi tr khng c a vo. Nu khng th th TITLE u tin c th gy ra mt
NullPointerException. Android bao gm c bin th SAX API ca chnh n (xem V d 8) loi b
yu cu bn phi vit trnh x l SAX ca chnh bn.
V d 8. Trnh phn tch SAX Android n gin
public class AndroidSaxFeedParser extends BaseFeedParser {
public AndroidSaxFeedParser(String feedUrl) {
super(feedUrl);
}
public List<Message> parse() {
final Message currentMessage = new Message();
RootElement root = new RootElement("rss");
final List<Message> messages = new ArrayList<Message>();
Element channel = root.getChild("channel");
Element item = channel.getChild(ITEM);
item.setEndElementListener(new EndElementListener(){
public void end() {
messages.add(currentMessage.copy());
}
});
item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setTitle(body);
}
});
item.getChild(LINK).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setLink(body);
}
});
item.getChild(DESCRIPTION).setEndTextElementListener(new
EndTextElementListener(){
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 9 ca 16
public void end(String body) {
currentMessage.setDescription(body);
}
});
item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){
public void end(String body) {
currentMessage.setDate(body);
}
});
try {
Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8,
root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
Nh ha, m phn tch SAX mi khng s dng trnh x l SAX. Thay vo n s dng cc
lp t gi android.sax trong SDK. Cc lp ny cho php bn m hnh ha cu trc ca ti liu XML
ca bn v thm mt trnh nghe s kin nu cn. Trong m trnh trn, bn khai bo rng ti liu ca
bn s c mt phn t gc c tn rss v rng phn t ny s c ba phn t con l channel. Tip
n bn ni rng channel s c ba phn t con c gi l ITEM v bn bt u gn cc trnh nghe.
i vi mi trnh nghe, bn s dng mt lp bn trong v danh thc hin giao din bn quan
tm (hoc EndElementListner hoc EndTextElementListener). Ch khng cn phi theo di d
liu k t. Vic ny khng ch n gin hn m thc s cn hiu qu hn. Cui cng, khi bn gi
dn phng thc tin ch Xml.parse, by gi bn a vo trnh x l c to ra t phn t gc.
Ton b m trnh trn trong V d 8 thuc loi ty chn. Nu bn thy thoi mi vi m trnh phn
tch SAX chun trong mi trng Java, th bn c th tch vo . Nu bn mun th cc trnh bao
bc tin li do Android SDK cung cp, bn cng c th s dng n. Nu bn khng mun s dng
SAX th sao y? Vn cn c mt vi la chon khc. La chn u tin bn s thy l DOM.
Lm vic DOM
DOM phn tch trn Android c h tr hon ton. N lm vic chnh xc nh khi n lm vic
trong m trnh Java m bn s chy trn my tnh bn hoc trn mt my ch. V d 9 trnh by
mt thc thi da trn DOM ca giao din trnh phn tch.
V d 9. Thc thi da trn DOM ca mt trnh phn tch im tin
public class DomFeedParser extends BaseFeedParser {
protected DomFeedParser(String feedUrl) {
super(feedUrl);
}
public List<Message> parse() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
List<Message> messages = new ArrayList<Message>();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(this.getInputStream());
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName(ITEM);
for (int i=0;i<items.getLength();i++){
Message message = new Message();
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 10 ca 16
Node item = items.item(i);
NodeList properties = item.getChildNodes();
for (int j=0;j<properties.getLength();j++){
Node property = properties.item(j);
String name = property.getNodeName();
if (name.equalsIgnoreCase(TITLE)){
message.setTitle(property.getFirstChild().getNodeValue());
} else if (name.equalsIgnoreCase(LINK)){
message.setLink(property.getFirstChild().getNodeValue());
} else if (name.equalsIgnoreCase(DESCRIPTION)){
StringBuilder text = new StringBuilder();
NodeList chars = property.getChildNodes();
for (int k=0;k<chars.getLength();k++){
text.append(chars.item(k).getNodeValue());
}
message.setDescription(text.toString());
} else if (name.equalsIgnoreCase(PUB_DATE)){
message.setDate(property.getFirstChild().getNodeValue());
}
}
messages.add(message);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
Ging nh v d SAX u tin, khng c g l c th i vi Android v m trnh ny. Trnh phn
tch DOM c tt c cc ti liu XML vo b nh ri sau cho php bn s dng cc DOM API
chy ngang qua cy XML, truy vn d liu m bn mun. y l m trnh rt d lm, v, trong
mt s cch, cn n gin hn c cc thc thi da trn SAX. Tuy nhin, thng thng DOM tiu
tn nhiu b nh hn v trc tin mi th u c c vo b nh. iu ny c th l mt vn
trn thit b di ng chy Android, nhng n c th p ng c trong mt vi trng hp s
dng nht nh m dung lng ti liu XML s khng bao gi qu ln. C th iu ny ng rng
cc nh pht trin Android on rng trnh phn tch SAX s ph bin hn rt nhiu trn cc
ng dng Android, do cc tin ch b sung c cung cp cho n. Mt loi trnh phn tch XML
khc cng c trn Android, v l trnh phn tch ko.
Trnh phn tch ko XML
Nh cp trong cc phn trc, Android khng cung cp h tr cho StAX API ca Java. Tuy
nhin Android li i km vi mt trnh phn tch ko lm vic tng t nh StAX. N cho php m
ng dng ca bn ko hoc tm kim cc s kin t trnh phn tch, tri ngc vi trnh phn tch
SAX t ng y cc s kin cho trnh x l. V d 10 miu t mt thc thi trnh phn tch ko ca
mt giao din trnh phn tch im tin.
V d 10. Thc thi da trn trnh phn tch ko
public class XmlPullFeedParser extends BaseFeedParser {
public XmlPullFeedParser(String feedUrl) {
super(feedUrl);
}
public List<Message> parse() {
List<Message> messages = null;
XmlPullParser parser = Xml.newPullParser();
try {
// auto-detect the encoding from the stream
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 11 ca 16
parser.setInput(this.getInputStream(), null);
int eventType = parser.getEventType();
Message currentMessage = null;
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
messages = new ArrayList<Message>();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM)){
currentMessage = new Message();
} else if (currentMessage != null){
if (name.equalsIgnoreCase(LINK)){
currentMessage.setLink(parser.nextText());
} else if (name.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(parser.nextText());
} else if (name.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(parser.nextText());
} else if (name.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase(ITEM) &&
currentMessage != null){
messages.add(currentMessage);
} else if (name.equalsIgnoreCase(CHANNEL)){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}
Trnh phn tch ko lm vic tng t nh trnh phn tch SAX. N c cc s kin tng t (phn
t bt u, phn t kt thc) nhng bn phi ko t chng (parser.next()). Cc s kin c gi
i di dng cc m s, v th bn c th s dng mt case-switch n gin. Ch , thay v nghe
cho n khi kt thc cc phn t nh trong phn tch SAX, vi trnh phn tch ko, tht d dng
tin hnh hu ht cc x l ngay t u. Trong m trnh trong V d 10, khi mt phn t bt u,
bn c th gi dn parser.nextText() ko tt c d liu k t t ti liu XML. iu ny mang
n mt s n gin ha tt cho phn tch SAX. Cng cn ch rng bn t mt c (bin boolean
done) nhn bit khi no bn n phn kt thc ni dung m bn quan tm. iu ny cho php
bn sm tm dng vic c ti liu XML, v bn bit rng m trnh s khng quan tm n phn
cn li ca ti liu. iu ny c th rt hu ch, c bit nu bn ch cn mt phn nh ti liu ang
c truy cp. Bn c th gim ng k thi gian phn tch bng cch dng vic phn tch cng
sm cng tt. Hn na, kiu ti u ha ny c bit quan trng trn thit b di ng ni tc kt
ni c th chm. Trnh phn tch ko c mt vi u im v hiu nng cng nh u im s dng
d dng. Cng c th s dng n vit XML.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 12 ca 16
To XML
n tn by gi, ti vn v ang tp trung phn tch XML t Internet. Tuy nhin, thnh thong
ng dng ca bn cn gi XML ti mt my ch xa. Hin nhin bn c th s dng mt
StringBuilder hoc ci g tng t to ra mt chui XML. Mt thay th khc na bt ngun
t trnh phn tch ko trong V d 11.
V d 11. Vit XML bng trnh phn tch ko
private String writeXml(List<Message> messages){
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("", "messages");
serializer.attribute("", "number", String.valueOf(messages.size()));
for (Message msg: messages){
serializer.startTag("", "message");
serializer.attribute("", "date", msg.getDate());
serializer.startTag("", "title");
serializer.text(msg.getTitle());
serializer.endTag("", "title");
serializer.startTag("", "url");
serializer.text(msg.getLink().toExternalForm());
serializer.endTag("", "url");
serializer.startTag("", "body");
serializer.text(msg.getDescription());
serializer.endTag("", "body");
serializer.endTag("", "message");
}
serializer.endTag("", "messages");
serializer.endDocument();
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Lp XmlSerializer l mt phn trong gi ging nh XmlPullParser c dng trong phn trc.
Thay v ko vo cc s kin, n y chng ra n mt lung hoc mt b ghi. Trong trng hp
ny, n d dng y chng sang mt th hin java.io.StringWriter. N cung cp mt API n
gin cng vi cc phng thc bt u v kt thc mt ti liu, x l cc phn t v thm
vn bn hoc cc thuc tnh. y c th l mt la chn thay th kh tt cho vic s dng mt
StringBuilder, v d dng m bo XML ca bn chun xc.
Tng kt
Loi ng dng no bn mun xy dng cho cc thit b Android? D l loi no i na, nu n cn
lm vic vi d liu t Internet, th c th n cn phi lm vic vi XML. Trong bi vit ny, bn
thy rng Android c tch hp i cng vi rt nhiu cng c x l XML. Bn c th chn ly mt
trong cc cng c nh l cng-c-la-chn ca bn, hoc bn c th la chn cn c vo trng
hp s dng. Thng thng s la chn an ton l chn cng vi SAX, v Android cung cp cho
bn c cch truyn thng thc hin SAX v mt trnh bao bc tin li kho lo trn c SAX. Nu
ti liu ca bn nh, th c l DOM l cch n gin hn nn theo. Nu ti liu ca bn ln, nhng
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 13 ca 16
bn ch cn mt phn ti liu, th trnh phn tch ko XML c l l cch hiu qu hn nn theo. Cui
cng, vit XML, gi trnh phn tch ko cng cung cp mt cch thun tin lm vic . V
th, ci m XML ca bn cn c l g i na, th Android SDK vn c cho bn.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 14 ca 16
Cc ti v
M t Tn Kch thc
AndroidXml.zip 70KB
ibm.com/developerWorks/vn/ developerWorks
Lm vic vi XML trn Android Trang 15 ca 16
Ti nguyn
Hc tp
Develop Android applications with Eclipse (Frank Ableson,developerWorks, 02/2008): Cch
d dng nht pht trin cc ng dng Android l s dng Eclipse. Hy tm hiu tt c iu
ny trong bi hng dn ny.
Using integrated packages: Codehaus' Woodstox (Michael Galpin, developerWorks,
07/2007): Dnh cho so snh khc ca SAX, DOM, v trnh phn tch ko, hy c bi vit
ny.
StAX'ing up XML, Part 2: Pull parsing and events (Peter Nehrer, developerWorks, December
2006): Ci nhn su hn v trnh phn tch ko XML.
Understanding SAX (Nicholas Chase, developerWorks, 07/2003): Tr thnh chuyn gia v
phn tch SAX vi bi hng dn ny.
Understanding DOM (Nicholas Chase, developerWorks, 03/2007): hiu thm v trnh
phn tch, hy c bi hng dn ny.
Ti liu Android SDK: Tm hiu b cng c ny pht trin v sa li m ng dng v thit
k mt UI ng dng.
Open Handset Alliance: Tm kim nh ti tr cho Android, mt nhm 47 cng ty cng ngh
v di ng lm vic y nhanh tc i mi trong cng ngh di ng.
Chng ch XML ca IBM: Tm hiu xem lm th no m bn c th tr thnh mt Nh pht
trin c chng ch IBM trong XML v cc cng ngh lin quan.
Th vin k thut XML: Xem khu vc developerWorks XML ni c rt nhiu cc bi vit
chuyn mn v cc mo nh, bi hng dn, cc tiu chun v Sch IBM.
Cc s kin k thut WebdeveloperWorks v web qung b: Lm quen vi cng ngh trong
cc phin ny.
developerWorks podcast: Nghe cc bi phng vn th v v cc cuc tho lun dnh cho cc
nh pht trin phn mm.
Ly sn phm v cng ngh
Android SDK: Ti v, truy cp tham chiu API, v nhn tin tc mi nht v Android t trang
web chnh thc ca cc nh pht trin Android.
D n M ngun M Android: Ly m ngun m cho Android.
Eclipse IDE: Ly phin bn mi nht v cho n hot ng.
Cc phin bn nh gi sn phm IBM: Ti v hoc s dng cc bn th nghim trc tuyn
trong IBM SOA Sandbox v bt u s dng cc cng c pht trin ng dng v cc sn
phm phn mm trung gian t DB2, Lotus, Rational, Tivoli, v WebSphere.
Tho lun
Cc din n tho lun v XML: Tham gia mt s cuc tho lun v XML.
developerWorks blogs: c cc blog ny v tham gia vo cng ng developerWorks.
developerWorks ibm.com/developerWorks/vn/
Lm vic vi XML trn Android Trang 16 ca 16
i nt v tc gi
Michael Galpin
Michael Galpin pht trin phn mm Java mt cch chuyn nghip t nm 1998.
ng hin ang lm vic cho eBay. ng c bng v ton hc ca Vin Cng ngh
California.
Copyright IBM Corporation 2010
(www.ibm.com/legal/copytrade.shtml)
Nhn hiu ng k
(www.ibm.com/developerworks/vn/ibm/trademarks/)

You might also like