You are on page 1of 7

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();
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
(name.equalsIgnoreCase(PUB_DATE)){

if

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
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
(name.equalsIgnoreCase(DESCRIPTION)){

if

currentMessage.setDescription(parser.nextText());
}
else
(name.equalsIgnoreCase(PUB_DATE)){

if

currentMessage.setDate(parser.nextText());
}
else
(name.equalsIgnoreCase(TITLE)){

if

currentMessage.setTitle(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();

if

(name.equalsIgnoreCase(ITEM)

&&
currentMessage != null){
messages.add(currentMessage);
}
else
(name.equalsIgnoreCase(CHANNEL)){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
}
}

if

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.

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 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.

You might also like