You are on page 1of 6

www.giaotrinhcntt.

com
www.giaotrinhcntt.com

V d 6. Trnh x l SAX
import
org.developerworks.android.BaseFeedParser.*;

static

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

if

www.giaotrinhcntt.com
www.giaotrinhcntt.com

(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);
}
}

if

if

@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

www.giaotrinhcntt.com
www.giaotrinhcntt.com

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);
}

www.giaotrinhcntt.com
www.giaotrinhcntt.com

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();

www.giaotrinhcntt.com
www.giaotrinhcntt.com

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);
}
});

www.giaotrinhcntt.com
www.giaotrinhcntt.com

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