編輯:關於Android編程
通用性強,它會將XML文件的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據;簡單直觀,但需要將文檔讀取到內存,並不太適合移動設備;
sax:
SAX是一個解析速度快並且占用內存少的xml解析 器;采用事件驅動,它並不需要解析整個文檔;實現:繼承DefaultHandler,覆寫startElement、endElement、characters等方法;
pull: Android自帶的XML解析器,和SAX基本類似,也是事件驅動,不同的是PULL事件返回的是數值型;推薦使用。 -------------------------------------------------------------------------- 下面介紹pull解析和sax解析xml的方式,dom一般不會在移動設備上使用,故略去。 -------------------------------------------------------------------------- 一.pull解析: 1.需要使用的類:
android.util.Xml org.xmlpull.v1.XmlSerializer org.xmlpull.v1.XmlPullParser
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() { Listpull解析xml: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(); } }
//返回List待解析的xml文件(下同,天氣實體bean對象略):
二、sax解析 1.需要使用的類:晴 34 東風 雷陣雨 24 南風 雨夾雪 32 西風
一個自定義的繼承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的方法,利用此方法將解析結果返回。
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 Map2.解析xml: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; } }
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; }
1、把aar復制到項目中的 libs 裡面 2、在module 裡面的build.gradle 的根目錄添加repositories{ flatDir {
AndroidStudio 實現加載字體資源的方法在android中字體的格式總是不能盡善盡美的顯示出來 , 於是要求我們使用一些有美感的字體,加載的方式(就
Android TextView 圓弧效果圖:布局代碼:<TextView android:id=@+id/product_tag
前言在Android中使用 MVP 來開發已經出來很久了,剛好Google又出了一系列的architecture samples,在此就整理一下對於MVP的認知和實踐總結