編輯:關於Android編程
我們在開發Android應用的過程中難免會與網絡請求接觸,網路請求獲得的數據一般都是有一定的格式或者約定的形式來返回,這時候我們就需要對返回的數據進行解析,然後從中提取出我們需要呈現在界面上的數據,一般我們遇到的最常見的兩種便於網絡傳輸的數據類型便是xml和json,下面就詳細介紹一下有關他們的解析方式。
首先我們先定義一段xml數據。
1
Google
1.0
2
Android
2.0
3
Play
3.0
方式一、Pull解析xml數據
1、獲得XmlPullParserFactory實例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2、 獲得XmlPullParser實例
XmlPullParser xmlPullParser = factory.newPullParser();
3、設置需要解析的數據
xmlPullParser.setInput(new StringReader(xmlData));
4、獲得當前的解析事件
int eventType = xmlPullParser.getEventType();
5、解析結點,知道xml數據解析完成
下面是一個簡單的小例子來解析最上面給出的xml數據
/**
* 使用Pull解析xml數據
*/
private void parseXmlDataWithPull(String xmlData) {
try {
//獲得XmlPullParserFactory實例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//獲得XmlPullParser實例
XmlPullParser xmlPullParser = factory.newPullParser();
//將需要解析的數據設置進去
xmlPullParser.setInput(new StringReader(xmlData));
//獲得當前的解析事件
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
//判斷解析工作是否完成
while (eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch (eventType){
//開始解析某個結點
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)){
id = xmlPullParser.nextText();
}else if ("name".equals(nodeName)){
name = xmlPullParser.nextText();
}else if ("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
break;
//完成解析某個結點
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)){
Log.d("xiao", "id " + id);
Log.d("xiao", "name " + name);
Log.d("xiao", "version " + version);
}
break;
default:
break;
}
//獲取下一個解析事件
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
方式二、SAX解析xml數據
SAX解析雖然比Pull解析復雜一點,但在語義理解方面更加清楚,下面是它的具體用法。
1、創建一個類繼承自DefaultHandler,並重寫其中的5個方法。
public class MyHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
//在開始進行xml解析的時候調用
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
//開始解析某個結點的時候調用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//記錄當前的結點名
nodeName = localName;
}
//在獲取結點中內容的時候調用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//根據當前的結點名判斷將內容添加到哪一個StringBuilder對象中
if ("id".equals(nodeName)){
id.append(ch, start, length);
}else if ("name".equals(nodeName)){
name.append(ch, start, length);
}else if ("version".equals(nodeName)){
version.append(ch, start, length);
}
}
//某個結點解析完成的時候調用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)){
//去掉可能包含的回車符和換行符
Log.d("GGGG", "id " + id.toString().trim());
Log.d("GGGG", "name " + name.toString().trim());
Log.d("GGGG", "version " + version.toString().trim());
//清空StringBuilder
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
//完成整個xml解析的時候調用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
2、獲得SAXParserFactory的實例
SAXParserFactory factory = SAXParserFactory.newInstance();
3、獲得XMLReader的實例
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
4、獲得我們自己定義的處理類的實例
MyHandler handler = new MyHandler();
5、將MyHandler類的實例設置到XMLReader中
xmlReader.setContentHandler(handler);
6、開始解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
下面給出完整的代碼,解析最上面給出的xml文件
/**
* 用Sax解析xml數據
* @param xmlData
*/
private void parseXmlDataWithSax(String xmlData){
//獲得SAXParserFactory的實例
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//獲得XMLReader的實例
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
//獲得我們自己定義的處理類的實例
MyHandler handler = new MyHandler();
//將MyHandler類的實例設置到XMLReader中
xmlReader.setContentHandler(handler);
//開始解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
方式三、Dom解析xml數據
Dom解析也是xml常用的一種解析方式,但由於它在解析時是將整個文檔樹全部加載到內存中,所以它一般只用來解析文檔規模較小的場景,下面是一段簡單的代碼來解析文檔最開頭給出的那段xml文檔。
/**
* 使用Dom解析xml
*
* @param xmlData
*/
private void parseXmlWithDom(String xmlData) {
//得到DOM解析器的工廠實例
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//從DOM工廠中獲得DOM解析器
DocumentBuilder dbBuilder = null;
try {
dbBuilder = dbFactory.newDocumentBuilder();
//把要解析的xml文檔讀入DOM解析器
Document doc = dbBuilder.parse(new InputSource(new StringReader(xmlData)));
//得到文檔名稱為app的元素的節點列表
NodeList nList = doc.getElementsByTagName("app");
//遍歷該集合,顯示集合中的元素及其子元素的名字
for(int i = 0; i< nList.getLength() ; i ++){
//Node轉型WieElement
Element node = (Element)nList.item(i);
Log.d("MMMM", "id: "+ node.getElementsByTagName("id").item(0).getFirstChild().getNodeValue());
Log.d("MMMM", "name: "+ node.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
Log.d("MMMM", "version: "+ node.getElementsByTagName("version").item(0).getFirstChild().getNodeValue());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Android中View自定義XML屬性詳解以及R.attr與R.styleable的區別
為View添加自定義XML屬性Android中的各種Widget都提供了很多XML屬性,我們可以利用這些XML屬性在layout文件中為Widget的屬性賦值。如下所示:
Android模仿To圈兒個人資料界面層疊淡入淡出顯示效果
前幾天做的一個仿To圈個人資料界面的實現效果下面是To圈的效果Gif圖:做這個東西其實也花了一下午的時間,一開始思路一直沒理清楚,就開始盲目的去做,結果反而事倍功半。以後
Android系統移植與調試之-------)如何修改Android系統默認顯示
1、首先解決【設置】界面默認顯示【開發者選項】的問題查看源代碼:packages/apps/Settings/src/com/android/settings
android如何寫一個投票或是表達觀點的界面
先上圖: 把這些表示觀點的view放在一個LinearLayout裡: 每個Item可以這樣來實現: &n