æ¬æ主è¦è®²è§£Androidå¼åä¸å¦ä½å¯¹XMLæ件ç解æï¼ç±äºXMLæ件å
·æä¸å¹³å°æ å
³ï¼å¹¿æ³åºç¨äºæ°æ®éä¿¡ä¸ï¼å æ¤è§£æXMLæ件就æ¾å¾å¾ææä¹ãAndroid对XMLæ件解æçæ¹æ³ä¸»è¦æ3ç§ã é常æä¸ç§æ¹å¼:DOMãSAXåPULLï¼ä¸é¢å°±åå«é对è¿ä¸ç§æ¹å¼æ¥è¿è¡è®¨è®ºã
æ件å
容å¦ä¸æ示ï¼
é£ä¹å°±æ¯è¦å¯¹æ¤XMLæ件å解æãä¸é¢æ们就åå«ç¨DOM,SAXåPULLä¸ç§æ¹å¼ï¼åå«å¯¹æ¤XMLæ件å解æã
DOMæ¹å¼
DOMæ¹å¼è§£æxmlæ¯å
æxmlææ¡£é½è¯»å°å
åä¸ï¼ç¶ååç¨DOM APIæ¥è®¿é®æ å½¢ç»æï¼å¹¶è·åæ°æ®ãç±DOM解æçæ¹å¼å¯ä»¥ç¥éï¼å¦æXMLæ件å¾å¤§çæ¶åï¼å¤çæçå°±ä¼åå¾æ¯è¾ä½ï¼è¿ä¹æ¯DOMæ¹å¼çä¸ä¸ªç¼ºç¹ã
ç°å¨æ们æ¥è§£æä¸æä¸æå°çæå
³å¤©æ°é¢æ¥ä¿¡æ¯ç¸å
³çxmlæ件ãä»ä¹æ¯è§£æå¢ï¼è¯´çéä¿ä¸ç¹ï¼å°±æ¯å°è¿ä¸ªå¸¦æ ç¾çXMLæ件è¯å«åºæ¥ï¼å¹¶æ½åä¸äºç¸å
³çï¼å¯¹æ们æç¨çä¿¡æ¯æ¥ç»æ们使ç¨ãé£å¨è¿ä¸ªæ件éï¼æ¶é´ï¼å¤©æ°ï¼æ¸©åº¦ï¼ä»¥åå¾æ 对æ们æ¥è¯´æ¯éè¦å¾å°çãæ们è¦å¯¹å
¶å解æã
解æçå
·ä½æè·¯æ¯ï¼
1. å°XMLæ件å è½½è¿æ¥ã
2. è·åææ¡£çæ ¹èç¹
3. è·åææ¡£æ ¹èç¹ä¸ææåèç¹çå表
4. è·ååèç¹å表ä¸éè¦è¯»åçèç¹ä¿¡æ¯
æ ¹æ®è¿4个æ¥éª¤ï¼æ们è¿è¡å¼åï¼
é¦å
å°±æ¯å¦ä½å è½½XMLæ件ï¼å设æ¤æ件æ¥æºäºç½ç»ã
SAXæ¹å¼
SAXæ¯Simple API for XMLç缩åãæ¯ä¸ä¸ªå
ä¹å¯ä»¥çææ¯ä¸äºæ¥å£ã
ç¸æ¯äºDOMèè¨SAXæ¯ä¸ç§é度æ´å¿«ï¼æ´ææï¼å ç¨å
åæ´å°ç解æXMLæ件çæ¹æ³ãå®æ¯éè¡æ«æï¼å¯ä»¥åå°è¾¹æ«æ边解æï¼å æ¤SAXå¯ä»¥å¨è§£æææ¡£çä»»ææ¶å»åæ¢è§£æãé常éç¨äºAndroidç移å¨è®¾å¤ã
SAXæ¯åºäºäºä»¶é©±å¨çãæè°äºä»¶é©±å¨å°±æ¯è¯´ï¼å®ä¸ç¨è§£æå®æ´ä¸ªææ¡£ï¼å¨æå
容顺åºè§£æææ¡£è¿ç¨ä¸ï¼SAXä¼å¤æå½å读å°çå符æ¯å¦ç¬¦åXMLæ件è¯æ³ä¸çæé¨åãå¦æ符åæé¨åï¼åä¼è§¦åäºä»¶ãæè°è§¦åäºä»¶ï¼å°±æ¯è°ç¨ä¸äºåè°æ¹æ³ãå½ç¶androidçäºä»¶æºå¶æ¯åºäºåè°æ¹æ³çï¼å¨ç¨SAX解æxmlææ¡£æ¶åï¼å¨è¯»åå°ææ¡£å¼å§åç»ææ ç¾æ¶åå°±ä¼åè°ä¸ä¸ªäºä»¶ï¼å¨è¯»åå°å
¶ä»èç¹ä¸å
容æ¶åä¹ä¼åè°ä¸ä¸ªäºä»¶ãå¨SAXæ¥å£ä¸ï¼äºä»¶æºæ¯org.xml.saxå
ä¸çXMLReaderï¼å®éè¿parser()æ¹æ³æ¥è§£æXMLææ¡£ï¼å¹¶äº§çäºä»¶ãäºä»¶å¤çå¨æ¯org.xml.saxå
ä¸ContentHanderãDTDHanderãErrorHandlerï¼ä»¥åEntityResolverè¿4个æ¥å£ã
è¿å个æ¥å£ç详ç»è¯´æå¦ä¸ï¼
äºä»¶å¤çå¨å称
äºä»¶å¤çå¨å¤ççäºä»¶
XMLReader注åæ¹æ³
ContentHander
XMLææ¡£çå¼å§ä¸ç»æï¼
XMLææ¡£æ ç¾çå¼å§ä¸ç»æï¼æ¥æ¶å符æ°æ®ï¼è·³è¿å®ä½ï¼æ¥æ¶å
ç´ å
容ä¸å¯å¿½ç¥ç空ç½çã
setContentHandler(ContentHandler h)
DTDHander
å¤çDTD解ææ¶äº§ççç¸åºäºä»¶
setDTDHandler(DTDHandler h)
ErrorHandler
å¤çXMLææ¡£æ¶äº§ççé误
setErrorHandler(ErrorHandler h)
EntityResolver
å¤çå¤é¨å®ä½
setEntityResolver(EntityResolver e)
æ们ç¨æ¥åå
容解æçåè°æ¹æ³ä¸è¬é½å®ä¹å¨ContentHandleræ¥å£ä¸ã
ContentHandleræ¥å£å¸¸ç¨çæ¹æ³ï¼
startDocument()
å½éå°ææ¡£çå¼å¤´çæ¶åï¼è°ç¨è¿ä¸ªæ¹æ³ï¼å¯ä»¥å¨å
¶ä¸åä¸äºé¢å¤ççå·¥ä½ã
endDocument()
å½ææ¡£ç»æçæ¶åï¼è°ç¨è¿ä¸ªæ¹æ³ï¼å¯ä»¥å¨å
¶ä¸åä¸äºååçå·¥ä½ã
startElement(String namespaceURI, String localName,String qName, Attributes atts)
å½è¯»å°å¼å§æ ç¾çæ¶åï¼ä¼è°ç¨è¿ä¸ªæ¹æ³ãnamespaceURIå°±æ¯å½å空é´ï¼localNameæ¯ä¸å¸¦å½å空é´åç¼çæ ç¾åï¼qNameæ¯å¸¦å½å空é´åç¼çæ ç¾åãéè¿attså¯ä»¥å¾å°ææçå±æ§ååç¸åºçå¼ã
endElement(String uri, String localName, String name)
å¨éå°ç»ææ ç¾çæ¶åï¼è°ç¨è¿ä¸ªæ¹æ³ã
characters(char[] ch, int start, int length)
è¿ä¸ªæ¹æ³ç¨æ¥å¤çå¨XMLæ件ä¸è¯»å°çå
容ãä¾å¦ï¼<high data="30"/>主è¦ç®çæ¯è·åhighæ ç¾ä¸çå¼ã
第ä¸ä¸ªåæ°ç¨äºåæ¾æ件çå
容ï¼åé¢ä¸¤ä¸ªåæ°æ¯è¯»å°çå符串å¨è¿ä¸ªæ°ç»ä¸çèµ·å§ä½ç½®åé¿åº¦ï¼ä½¿ç¨new String(ch,start,length)å°±å¯ä»¥è·åå
容ã
注æï¼
SAXçä¸ä¸ªéè¦ç¹ç¹å°±æ¯å®çæµå¼å¤çï¼å½éå°ä¸ä¸ªæ ç¾çæ¶åï¼å®å¹¶ä¸ä¼çºªå½ä¸ä¹åæ碰å°çæ ç¾ï¼å³å¨startElement()æ¹æ³ä¸ï¼ææè½å¤ç¥éçä¿¡æ¯ï¼å°±æ¯æ ç¾çåååå±æ§ï¼è³äºæ ç¾çåµå¥ç»æï¼ä¸å±æ ç¾çååï¼æ¯å¦æåå
å±ççå
¶å®ä¸ç»æç¸å
³çä¿¡æ¯ï¼é½æ¯ä¸ç¥éçï¼é½éè¦ä½ çç¨åºæ¥å®æãè¿ä½¿å¾SAXå¨ç¼ç¨å¤çä¸æ²¡æDOMæ¹ä¾¿ã
ç°å¨æ们æªåä¸æ®µXMLæ件æ¥å解æï¼å
¶è°ç¨æ¹æ³æ¯è¿æ ·çï¼
<?xml version="1.0"?> ----------> startDocument()
<weather> ----------> startElement
<forecast_information> ----------> startElement
<city> ----------> startElement
beijing ----------> characters
</city> ----------> endElement
</forecast_information > ----------> endElement
</weather > ----------> endElement
ææ¡£ç»æ ----------> endDocument()
SAXç解ææ¥éª¤ï¼
é¦å
éè¦æ³¨æçæ¯ï¼
SAXè¿ä¸ºå
¶å¶å®äºä¸ä¸ªHelperç±»ï¼DefaultHandlerå®å®ç°äºContentHandlerè¿ä¸ªæ¥å£ï¼ä½æ¯å
¶ææçæ¹æ³ä½é½ä¸ºç©ºï¼å¨å®ç°çæ¶åï¼ä½ åªéè¦ç»§æ¿è¿ä¸ªç±»ï¼ç¶åéè½½ç¸åºçæ¹æ³å³å¯ã
使ç¨SAX解æXMLæ件ä¸è¬æ以ä¸äºä¸ªæ¥éª¤ï¼
1ãå建ä¸ä¸ªSAXParserFactory对象ï¼
2ãè°ç¨SAXParserFactoryä¸çnewSAXParseræ¹æ³å建ä¸ä¸ªSAXParser对象ï¼
3ãç¶åå¨è°ç¨SAXParserä¸çgetXMLReaderæ¹æ³è·åä¸ä¸ªXMLReader对象ï¼
4ãå®ä¾åä¸ä¸ªDefaultHandler对象
5ãè¿æ¥äºä»¶æºå¯¹è±¡XMLReaderå°äºä»¶å¤çç±»DefaultHandlerä¸
6ãè°ç¨XMLReaderçparseæ¹æ³ä»è¾å
¥æºä¸è·åå°çxmlæ°æ®
7ãéè¿DefaultHandlerè¿åæ们éè¦çæ°æ®éåã
æ们ä»ç¶æ¥è§£æä¸è¿°é£ä¸ªå¤©æ°é¢æ¥çXMLæ件ã
ç¼å代ç å¦ä¸ï¼
[java] view plaincopy
mySAX.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
try{
String url = "
http://www.google.com/ig/api?&weather=beijing";
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = client.execute(req);
HttpEntity ent = resp.getEntity();
InputStream stream = ent.getContent(); //å°æ件导å
¥æµï¼å æ¤ç¨InputStream
SAXParserFactory saxFactory = SAXParserFactory.newInstance(); //è·åä¸ä¸ªå¯¹è±¡
SAXParser saxParser = saxFactory.newSAXParser();//å©ç¨è·åå°ç对象å建ä¸ä¸ªè§£æå¨
XMLContentHandler handler = new XMLContentHandler();//设置defaultHandler
saxParser.parse(stream, handler);//è¿è¡è§£æ
stream.close();//å
³éæµ
/*XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); //è·åä¸ä¸ªXMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(stream));
stream.close();*/
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public class XMLContentHandler extends DefaultHandler {
private static final String TAG = "XMLContentHandler";
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.i(TAG, "解æå
容ï¼"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "æ档解æå®æ¯ã");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, localName+"解æå®æ¯");
}
@Override
public void startDocument() throws SAXException {
Log.i(TAG, "å¼å§è§£æ... ...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "解æå
ç´ ï¼"+localName);
if(localName.equals("high")){
Log.i(TAG, "解æå
ç´ ï¼"+localName);
i++;
if(i==2){
highestTmp.setText(String.valueOf((Integer.parseInt(attributes.getValue(0))-32)*5/9));
}
}
}
}
ä¸é¢çé£æ®µæ³¨éï¼
[java] view plaincopy
/*XMLReader xmlReader =saxFactory.newSAXParser().getXMLReader(); //è·åä¸ä¸ªXMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(stream));
stream.close();*/
æ¯ç¨XMLReaderæ¥å解æçå¦å¤ä¸ç§æ¹æ³ãæææ¯ä¸æ ·çãè¿éå¯ä»¥ä¼ æµï¼ä¹å¯ä»¥ä¼ ä¸ä¸ªå符串ï¼å¦ä¸æ示ï¼æ¯ä¼ å符串ã
[java] view plaincopy
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
PULLæ¹å¼
é¤äºå¯ä»¥ä½¿ç¨ SAXåDOM解æXMLæ件ï¼ä¹å¯ä»¥ä½¿ç¨Androidå
ç½®çPull解æå¨è§£æXMLæ件ã Pull解æå¨çè¿è¡æ¹å¼ä¸ SAX 解æå¨ç¸ä¼¼ãå®ä¹æ¯äºä»¶è§¦åçãPull解ææ¹å¼è®©åºç¨ç¨åºå®å
¨æ§å¶æ档该æä¹æ ·è¢«è§£æãæ¯å¦å¼å§åç»æå
ç´ äºä»¶ï¼ä½¿ç¨parser.next()å¯ä»¥è¿å
¥ä¸ä¸ä¸ªå
ç´ å¹¶è§¦åç¸åºäºä»¶ãéè¿Parser.getEventType()æ¹æ³æ¥åå¾äºä»¶ç代ç å¼ï¼è§£ææ¯å¨å¼å§æ¶å°±å®æäºå¤§é¨åå¤çãäºä»¶å°ä½ä¸ºæ°å¼ä»£ç 被åéï¼å æ¤å¯ä»¥ä½¿ç¨ä¸ä¸ªswitch对æå
´è¶£çäºä»¶è¿è¡å¤çã
Pull解ææ¯ä¸ä¸ªéåææ¡£çè¿ç¨ï¼æ¯æ¬¡è°ç¨next()ï¼nextTag(), nextToken()ånextText()é½ä¼ååæ¨è¿ææ¡£ï¼å¹¶ä½¿Parseråçå¨æäºäºä»¶ä¸é¢ï¼ä½æ¯ä¸è½åéãç¶åææ档设置ç»Parserã
Androidä¸å¯¹Pullæ¹æ³æä¾äºæ¯æçAPIï¼ä¸»è¦æ¯
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserFactory;
äºä¸ªç±»ï¼å
¶ä¸ä¸»è¦ä½¿ç¨çæ¯XmlPullParserï¼XmlPullParserFactoryæ¯ä¸ä¸ªå·¥åï¼ç¨äºæ建XmlPullParser对象ã
åºç¨ç¨åºéè¿è°ç¨XmlPullParser.next()çæ¹æ³æ¥äº§çEventï¼ç¶ååå¤çEventã
æ们ä»ç¶æ¿ä¸è¿°å¤©æ°é¢æ¥çXMLæ件çä¸é¨åæ¥åä¾åã
ä¾å¦ï¼éè¦è§£æçXMLæ件æ¯ï¼
[java] view plaincopy
<forecast_conditions>
<day_of_week data="å¨ä¸"/>
<low data="22"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="å¯è½æé¨"/>
</forecast_conditions>
è¿é¨åXMLæ件ä¸day_of_week,low,highçæ¯TAGï¼dataæ¯ATTRIBUTEAãå½ç¶ï¼å¦ææ<></>夹å¨å¼å§åç»æ符å·ä¹é´çé¨åï¼å为TXETã
è¦æ³è§£æææ¡£å
è¦æ建ä¸ä¸ªXmlPullParser对象ã
[java] view plaincopy
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
final XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader("xmlStr");
è¿éçxmlStrå°±æ¯ä¸è¾¹çXMLæ件ã
æ¤æ¶ï¼ææ¡£å被åå§åï¼æ以å®åºè¯¥ä½äºææ¡£çå¼å§ï¼äºä»¶ä¸ºSTART_DOCUMENTï¼å¯ä»¥éè¿XmlPullParser.getEventType()æ¥è·åãç¶åè°ç¨next()ä¼äº§ç
START_TAGï¼è¿ä¸ªäºä»¶åè¯åºç¨ç¨åºä¸ä¸ªæ ç¾å·²ç»å¼å§äºï¼è°ç¨getName()ä¼è¿å" day_of_week ";è¥æTEXTï¼åånext()ä¼äº§çTEXTäºä»¶ï¼è°ç¨getText()ä¼è¿åTEXTï¼ç±äºæ¤å¤æ²¡æï¼æ以ånext()ï¼ä¼äº§çEND_TAGï¼è¿ä¸ªåè¯ä½ ä¸ä¸ªæ ç¾å·²ç»å¤çå®äºï¼ånext()ç´å°æåå¤çå®TAGï¼ä¼äº§çEND_DOCUMENTï¼å®åè¯ä½ æ´ä¸ªæ档已ç»å¤çå®æäºãé¤äºnext()å¤ï¼nextToken()ä¹å¯ä»¥ä½¿ç¨ï¼åªä¸è¿å®ä¼è¿åæ´å 详ç»çäºä»¶ï¼æ¯å¦COMMENT, CDSECT, DOCDECL, ENTITYççé常详ç»çä¿¡æ¯ãå¦æç¨åºå¾å°æ¯è¾åºå±çä¿¡æ¯ï¼å¯ä»¥ç¨nextToken()æ¥é©±å¨å¹¶å¤ç详ç»çäºä»¶ãéè¦æ³¨æä¸ç¹çæ¯TEXTäºä»¶æ¯æå¯è½è¿å空ç½çWhite Spacesæ¯å¦æ¢è¡ç¬¦æç©ºæ ¼çã
nextTag()--ä¼å¿½ç¥White Spacesï¼å¦æå¯ä»¥ç¡®å®ä¸ä¸ä¸ªæ¯START_TAGæEND_TAGï¼å°±å¯ä»¥è°ç¨nextTag()ç´æ¥è·³è¿å»ãé常å®æäºä¸ªç¨å¤ï¼å½START_TAGæ¶ï¼å¦æè½ç¡®å®è¿ä¸ªTAGå«æåTAGï¼é£ä¹å°±å¯ä»¥è°ç¨nextTag()产çåæ ç¾çSTART_TAGäºä»¶ï¼å½END_TAGæ¶ï¼å¦æç¡®å®ä¸æ¯ææ¡£ç»å°¾ï¼å°±å¯ä»¥è°ç¨nextTag()产çä¸ä¸ä¸ªæ ç¾çSTART_TAGãå¨è¿äºç§æ
åµä¸å¦æç¨next()ä¼æTEXTäºä»¶ï¼ä½è¿åçæ¯æ¢è¡ç¬¦æ空ç½ç¬¦ã
nextText()--åªè½å¨START_TAGæ¶è°ç¨ãå½ä¸ä¸ä¸ªå
ç´ æ¯TEXTæ¶ï¼TEXTçå
容ä¼è¿åï¼å½ä¸ä¸ä¸ªå
ç´ æ¯END_TAGæ¶ï¼ä¹å°±æ¯è¯´è¿ä¸ªæ ç¾çå
容为空ï¼é£ä¹ç©ºå串è¿åï¼è¿ä¸ªæ¹æ³è¿ååï¼Parserä¼åå¨END_TAGä¸ã
å°ç»ä¸ä¸ï¼å¦æå¨ä¸ä¸ªXMLææ¡£ä¸æ们åªéè¦åé¢ä¸é¨åæ°æ®ï¼ä½æ¯ä½¿ç¨SAXæ¹å¼æDOMæ¹å¼ä¼å¯¹æ´ä¸ªææ¡£è¿è¡è§£æï¼å°½ç®¡XMLææ¡£ä¸åé¢ç大é¨åæ°æ®æ们å
¶å®é½ä¸éè¦è§£æï¼å æ¤è¿æ ·å®é
ä¸å°±æµªè´¹äºå¤çèµæºã使ç¨PULLæ¹å¼æ£åéã
å½ç¹å»ä¸ç§æ¹å¼çä»»ä½ä¸ä¸ªæé®æ¶ï¼åè½å¤å¾å°ç¸åçç»æ