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/)