編輯:關於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()
{
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待解析的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 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; }
Android Studio添加aar
1、把aar復制到項目中的 libs 裡面 2、在module 裡面的build.gradle 的根目錄添加repositories{ flatDir {
AndroidStudio 實現加載字體資源的方法
AndroidStudio 實現加載字體資源的方法在android中字體的格式總是不能盡善盡美的顯示出來 , 於是要求我們使用一些有美感的字體,加載的方式(就
Android TextView(圓弧)邊框和背景實例詳解
Android TextView 圓弧效果圖:布局代碼:<TextView android:id=@+id/product_tag
Android 項目框架 使用MVP開發
前言在Android中使用 MVP 來開發已經出來很久了,剛好Google又出了一系列的architecture samples,在此就整理一下對於MVP的認知和實踐總結