安卓下解析xml檔案有多種方式: dom:
通用性強,它會將XML檔案的所有內容讀取到記憶體中,然後允許您使用DOM API遍曆XML樹、檢索所需的資料;簡單直觀,但需要將文檔讀取到記憶體,並不太適合行動裝置;
sax:
SAX是一個解析速度快並且佔用記憶體少的xml解析 器;採用事件驅動,它並不需要解析整個文檔;實現:繼承DefaultHandler,覆寫startElement、endElement、characters等方法;
pull: Android內建的XML解析器,和SAX基本類似,也是事件驅動,不同的是PULL事件返回的是數值型;推薦使用。 -------------------------------------------------------------------------- 下面介紹pull解析和sax解析xml的方式,dom一般不會在行動裝置上使用,故略去。 --------------------------------------------------------------------------
一.pull解析:
1.需要使用的類:
android.util.Xmlorg.xmlpull.v1.XmlSerializerorg.xmlpull.v1.XmlPullParser
2.是否需要額外jar包支援:否
3.使用方式:
1.建立xml: a. 建立xmlSerializer對象
XmlSerializer serializer = Xml.newSerializer();
b.設定輸出資料流
serializer.setOutput(outputstream,encoding)
c.開始建立xml文檔並添加節點
serializer.startDocument("utf-8",true);serializer.startTag(null,node_name);...serializer.endTag(null,node_name);serializer.endDocument();
2.解析xml: a.建立xmlPullParser對象
XmlPullParser parser = Xml.newPullParser();
b.設定輸入資料流
parser.setInput(inputstream,encoding);
c.解析
int type = parser.getEventType();while(type != XmlPullParser.END_DOCUMENT){ switch (type) { case XmlPullParser.START_TAG: break; case XmlPullParser.END_TAG: break; } type = parser.next();//一定別忘了這句代碼 }4.執行個體
/** * 使用XmlSerializer產生xml檔案 */ private void makeXML() { List citys = Data.getCityData(); try { File path = Environment.getExternalStorageDirectory(); XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(new FileOutputStream(new File(path,"weather.xml")),"utf-8"); serializer.startDocument("utf-8",true); serializer.startTag(null,"info"); for(WeatherData city : citys) { serializer.startTag(null,"city"); serializer.attribute(null,"id",city.getId()); serializer.attribute(null,"name",city.getName()); serializer.startTag(null,"weather"); serializer.text(city.getWeather()); serializer.endTag(null,"weather"); serializer.startTag(null,"temp"); serializer.text(city.getTemp()); serializer.endTag(null,"temp"); serializer.startTag(null,"wind"); serializer.text(city.getWind()); serializer.endTag(null,"wind"); serializer.endTag(null,"city"); } serializer.endTag(null,"info"); serializer.endDocument(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "儲存失敗",0).show(); } }pull解析xml:
//返回List>方便SimpleAdapter設定資料來源public static List> getWeatherData(File file) { if(file == null) return null; XmlPullParser parser = Xml.newPullParser(); List> list = null; Map map = null; try { parser.setInput(new FileInputStream(file),"utf-8"); int type = parser.getEventType(); while(type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_TAG: if("info".equals(parser.getName())) { list = new ArrayList>(); }else if("city".equals(parser.getName())) { map = new HashMap(); map.put("city",parser.getAttributeValue(null,"name")); }else if("weather".equals(parser.getName())) { map.put("weather",parser.nextText()); }else if("temp".equals(parser.getName())) { map.put("temp",parser.nextText()); }else if("wind".equals(parser.getName())) { map.put("wind",parser.nextText()); } break; case XmlPullParser.END_TAG: if("city".equals(parser.getName())) { list.add(map); map = null; } break; default: break; } type = parser.next(); } } catch (Exception e) { e.printStackTrace(); Log.i(TAG,e.getMessage()); } return list; }待解析的xml檔案(下同,天氣實體bean對象略):
晴 34 東風 雷陣雨 24 南風 雨夾雪 32 西風
二、sax解析
1.需要使用的類:
一個自訂的繼承org.xml.sax.helpers.DefaultHandler的處理器類javax.xml.parsers.SAXParserFactory工廠類javax.xml.parsers.SAXParser類,解析器
2
.是否需要擴充jar包:不需要
3.使用方式: 1.根據你要解析的xml定義一個處理器(複寫startDocument,startElement,characters,endElement方法):
public class SaxHandler4Weather extends DefaultHandler{ @Override public void startDocument() throws SAXException { } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { } @Override public void endElement(String uri, String localName, String qName) throws SAXException { } @Override public void characters(char[] ch, int start, int length) throws SAXException { }}2.利用解析器工廠,建立解析器對象
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser();
3.利用自訂的處理器解析xml
parser.parse(file,handler);
4.handler處理器對象中應該提供類似getData的方法,利用此方法將解析結果返回。
4.執行個體: 1.處理器
package cn.edu.chd.xmlutils;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/** * @author Rowand jj * *解析天氣的xml處理器 */public class SaxHandler4Weather extends DefaultHandler{ private Map map = null;//儲存單個解析的完整對象 private List> list = null;//儲存所有的解析對象 private String currentTag = null;//正在解析的元素的標籤 private String currentValue = null;//解析當前元素的值 private String nodeName = "city";//待解析的xml檔案中代表一個實體的xml根節點名 @Override public void startDocument() throws SAXException { list = new ArrayList>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals(nodeName))//發現city節點 { map = new HashMap(); } if(attributes!=null && map!= null) { for(int i = 0; i < attributes.getLength();i++) { if(attributes.getQName(i).equals("name")) { map.put("city", attributes.getValue(i)); } } } currentTag = qName; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals(nodeName))//一個city節點解析完畢 { list.add(map); map = null; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(currentTag!=null && map!=null) { currentValue = new String(ch,start,length).trim(); if(nodeName.equals(currentTag))//city節點 { }else if("weather".equals(currentTag))//是否是weather節點 { map.put("weather", currentValue); }else if("temp".equals(currentTag))//是否是temp節點 { map.put("temp",currentValue); }else if("wind".equals(currentTag))//是否是wind節點 { map.put("wind",currentValue); } } currentTag = null; currentValue = null; } public List> getList() { return list; }}2.解析xml:
public static List> getWeatherData(File file) { List> list = null; try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SaxHandler4Weather handler = new SaxHandler4Weather(); parser.parse(file,handler); list = handler.getList(); Log.i(TAG,"-->size = "+list.size()); } catch (Exception e) { Log.i(TAG,e.getMessage()); } return list; }
------------------------------------------------
下載範例程式碼