Android解æxmlæ件æ»å
±æä¸ç§æ¹æ³ï¼åå«æ¯ï¼
SAX解æXMLæä»¶ï¼ SAXæ¯ä¸ä¸ªè§£æé度快并ä¸å ç¨å
åå°çxml解æå¨ï¼é常éåç¨äºAndroidç移å¨è®¾å¤ã SAX解æXMLæ件éç¨çæ¯äºä»¶é©±å¨ï¼ä¹å°±æ¯è¯´ï¼å®å¹¶ä¸éè¦è§£æå®æ´ä¸ªææ¡£ï¼å¨æå
容顺åºè§£æææ¡£çè¿ç¨ä¸ï¼SAXä¼å¤æå½å读å°çå符æ¯å¦åæ³XMLè¯æ³ä¸çæé¨åï¼å¦æ符åå°±ä¼è§¦åäºä»¶ãæè°äºä»¶ï¼å
¶å®å°±æ¯ä¸äºåè°ï¼callbackï¼æ¹æ³ï¼è¿äºæ¹æ³(äºä»¶)å®ä¹å¨ContentHandleræ¥å£ãå¦ä¸ä»£ç ï¼
public static List<Person> readXML(InputStream inStream) {
try {
//å建解æå¨
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
//设置解æå¨çç¸å
³ç¹æ§ï¼true表示å¼å¯å½å空é´ç¹æ§
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//SAXç±»ï¼DefaultHandlerï¼å®å®ç°äºContentHandleræ¥å£ãå¨å®ç°çæ¶åï¼åªéè¦ç»§æ¿è¯¥ç±»ï¼éè½½ç¸åºçæ¹æ³å³å¯ã
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;//å½å解æçå
ç´ æ ç¾
public List<Person> getPersons() {
return persons;
}
//æ¥æ¶ææ¡£å¼å§çéç¥ãå½éå°ææ¡£çå¼å¤´çæ¶åï¼è°ç¨è¿ä¸ªæ¹æ³ï¼å¯ä»¥å¨å
¶ä¸åä¸äºé¢å¤ççå·¥ä½ã
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
//æ¥æ¶å
ç´ å¼å§çéç¥ãå½è¯»å°ä¸ä¸ªå¼å§æ ç¾çæ¶åï¼ä¼è§¦åè¿ä¸ªæ¹æ³ãå
¶ä¸namespaceURI表示å
ç´ çå½å空é´ï¼
//localName表示å
ç´ çæ¬å°å称ï¼ä¸å¸¦åç¼ï¼ï¼qName表示å
ç´ çéå®åï¼å¸¦åç¼ï¼ï¼atts 表示å
ç´ çå±æ§éå
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if(localName.equals("person")){
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName = localName;
}
//æ¥æ¶å符æ°æ®çéç¥ã该æ¹æ³ç¨æ¥å¤çå¨XMLæ件ä¸è¯»å°çå
容ï¼ç¬¬ä¸ä¸ªåæ°ç¨äºåæ¾æ件çå
容ï¼
//åé¢ä¸¤ä¸ªåæ°æ¯è¯»å°çå符串å¨è¿ä¸ªæ°ç»ä¸çèµ·å§ä½ç½®åé¿åº¦ï¼ä½¿ç¨new String(ch,start,length)å°±å¯ä»¥è·åå
容ã
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(tagName!=null){
String data = new String(ch, start, length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
//æ¥æ¶ææ¡£çç»å°¾çéç¥ãå¨éå°ç»ææ ç¾çæ¶åï¼è°ç¨è¿ä¸ªæ¹æ³ãå
¶ä¸ï¼uri表示å
ç´ çå½å空é´ï¼
//localName表示å
ç´ çæ¬å°å称ï¼ä¸å¸¦åç¼ï¼ï¼name表示å
ç´ çéå®åï¼å¸¦åç¼ï¼
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson = null;
}
this.tagName = null;
}
}DOM解æXMLæä»¶ï¼ DOM解æXMLæ件æ¶ï¼ä¼å°XMLæ件çææå
容读åå°å
åä¸ï¼ç¶åå
许æ¨ä½¿ç¨DOM APIéåXMLæ ãæ£ç´¢æéçæ°æ®ã使ç¨DOMæä½XMLç代ç çèµ·æ¥æ¯è¾ç´è§ï¼å¹¶ä¸ï¼å¨æäºæ¹é¢æ¯åºäºSAXçå®ç°æ´å ç®åãä½æ¯ï¼å 为DOMéè¦å°XMLæ件çææå
容读åå°å
åä¸ï¼æ以å
åçæ¶èæ¯è¾å¤§ï¼ç¹å«å¯¹äºè¿è¡Androidç移å¨è®¾å¤æ¥è¯´ï¼å 为设å¤çèµæºæ¯è¾å®è´µï¼æ以建议è¿æ¯éç¨SAXæ¥è§£æXMLæ件ï¼å½ç¶ï¼å¦æXMLæ件çå
容æ¯è¾å°éç¨DOMæ¯å¯è¡çã
Pull解æå¨è§£æXMLæä»¶ï¼ Pull解æå¨çè¿è¡æ¹å¼ä¸ SAX 解æå¨ç¸ä¼¼ãå®æä¾äºç±»ä¼¼çäºä»¶ï¼å¦ï¼å¼å§å
ç´ åç»æå
ç´ äºä»¶ï¼ä½¿ç¨parser.next()å¯ä»¥è¿å
¥ä¸ä¸ä¸ªå
ç´ å¹¶è§¦åç¸åºäºä»¶ãäºä»¶å°ä½ä¸ºæ°å¼ä»£ç 被åéï¼å æ¤å¯ä»¥ä½¿ç¨ä¸ä¸ªswitch对æå
´è¶£çäºä»¶è¿è¡å¤çãå½å
ç´ å¼å§è§£ææ¶ï¼è°ç¨parser.nextText()æ¹æ³å¯ä»¥è·åä¸ä¸ä¸ªTextç±»åå
ç´ çå¼