You are on page 1of 6

V d 6. Trnh x l SAX import 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 (localName.equalsIgnoreCase(LINK)){ currentMessage.setLink(builder.toString()); } else if static

if

(localName.equalsIgnoreCase(DESCRIPTION)){ currentMessage.setDescription(builder.toString()); } else (localName.equalsIgnoreCase(PUB_DATE)){ currentMessage.setDate(builder.toString()); } else (localName.equalsIgnoreCase(ITEM)){ messages.add(currentMessage); } builder.setLength(0); } } @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 if

if

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. V d 7. Trnh phn tch SAX Android public class BaseFeedParser { AndroidSaxFeedParser extends

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 BaseFeedParser { AndroidSaxFeedParser extends

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(ne w EndTextElementListener(){ 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.

You might also like