編輯:Android編程入門
在網絡上傳輸數據時最常用的格式有兩種,XML和JSON,下面首先學一下如何解析XML格式的數據。解析XML 格式的數據其實也有挺多種方式的,本節中我們學習比較常用的兩種,Pull解析和SAX 解析。
目錄導航
一、一般我們常用的五個事件:
二、pull解析的步驟:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput ( new FileReader (filename ) );
<?xml version="1.0" encoding="utf-8"?>
<LOL>
<person>
<!-- 這裡是蓋倫的注釋 -->
<name sex="man">蓋倫</name>
<address>德瑪西亞</address>
<say>我將帶頭沖鋒</say>
</person>
<person>
<!-- 這裡是亞索的注釋 -->
<name sex="man">亞索</name>
<address>艾歐尼亞</address>
<say>死亡如風,常伴吾身</say>
</person>
<person>
<!-- 這裡是瑞雯的注釋 -->
<name sex="girl">瑞雯</name>
<address>諾克薩斯</address>
<say>戰爭與謀殺之間,潛藏著我們的心魇</say>
</person>
</LOL>
// 得到xml的數據
private String getXMLData(String fileName) {
StringBuffer stringBuffer = new StringBuffer();
InputStream inputStream = null;
BufferedReader bufferedReader = null;
try {
inputStream = getResources().getAssets().open(fileName);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line + "\n");
}
bufferedReader.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Log.i(TAG, stringBuffer.toString());
return stringBuffer.toString();
}
// pull解析xml數據
public void pullParse(View view) {
String xmlData = getXMLData(fileName);
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String name = "";
String address = "";
String say = "";
String sex = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG: {
if ("name".equals(nodeName)) {
// sex與name的位置不能互換
// sex = xmlPullParser.getAttributeValue(0);
sex = xmlPullParser.getAttributeValue(null, "sex");
name = xmlPullParser.nextText();
} else if ("address".equals(nodeName)) {
address = xmlPullParser.nextText();
} else if ("say".equals(nodeName)) {
say = xmlPullParser.nextText();
}
break;
}
// 完成解析某個結點
case XmlPullParser.END_TAG: {
if ("person".equals(nodeName)) {
Log.d(TAG, "name: " + name);
Log.d(TAG, "address: " + address);
Log.d(TAG, "say: " + say);
Log.d(TAG, "sex: " + sex);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
一、 sax解析的簡要:
SAX:事件驅動型的XML解析方式。順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問,且是只讀的。由於移動設備的內存資源有限,SAX的順序讀取方式更適合移動開發。
二、 SAX解析XML步驟:
三、SAX解析的過程:
package com.example.linux.xmlparsetest;
import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Created by Linux on 2016/3/16.
*/
public class ContentHandler extends DefaultHandler {
private final static String TAG = "MainActivity";
private String nodeName;
private StringBuilder name;
private StringBuilder address;
private StringBuilder say;
private StringBuilder coment;
private StringBuilder sex;
// 文檔開始時執行
@Override
public void startDocument() throws SAXException {
name = new StringBuilder();
address = new StringBuilder();
say = new StringBuilder();
sex = new StringBuilder();
coment = new StringBuilder();
}
// 元素開始時執行
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 記錄當前結點名
nodeName = localName;
if (nodeName.equals("name") && attributes != null) {
sex.append(attributes.getValue("sex"));
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 根據當前的結點名判斷將內容添加到哪一個StringBuilder對象中
if ("name".equals(nodeName)) {
name.append(ch, start, length);
} else if ("address".equals(nodeName)) {
address.append(ch, start, length);
} else if ("say".equals(nodeName)) {
say.append(ch, start, length);
}
}
// 元素結束時執行
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("person".equals(localName)) {
Log.d(TAG, "name is " + name.toString().trim());
Log.d(TAG, "adress is " + address.toString().trim());
Log.d(TAG, "say is " + say.toString().trim());
Log.d(TAG, "sex is " + sex.toString().trim());
// 最後要將StringBuilder清空掉
name.setLength(0);
address.setLength(0);
say.setLength(0);
sex.setLength(0);
}
}
// 文檔結束時
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
// sax解析數據
public void saxParse(View view) {
String xmlData = getXMLData(fileName);
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
// 將ContentHandler的實例設置到XMLReader中
xmlReader.setContentHandler(handler);
// 開始執行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}
區別:
相似性:
Pull解析器也提供了類似SAX的事件,開始文檔START_DOCUMENT和結束文檔END_DOCUMENT,開始元素START_TAG和結束元素END_TAG,遇到元素內容TEXT等,但需要調用next() 方法提取它們(主動提取事件)。
使用:
如果在一個XML文檔中我們只需要前面一部分數據,但是使用SAX方式或DOM方式會對整個文檔進行解析,盡管XML文檔中後面的大部分數據我們其實都不需要解析,因此這樣實際上就浪費了處理資源。使用PULL方式正合適。
源碼下載 訪問密碼 2c66
Android開發學習之路-Android Studio真神器!
放假之後電腦配置升級就開始用Android Studio(下面簡稱AS)了,那個酸爽真的不是一般的啊,這裡開一篇博客來記錄下AS裡面各種酷炫的功能,有更好玩的,大家不要吝
總結一下Android中主題(Theme)的正確玩法
在AndroidManifest.xml文件中有<application android:theme=@style/AppTheme>,其中的@style/A
Android開發學習——Android項目的目錄結構
Android項目的目錄結構: 資源文件夾:清單配置文件:Android的四大組件在使用前全部需要在清單文件中配置<?xml version
android開發環境以及genymotion虛擬機配合HBuilder測試(自總結)
一、安裝android-studiohttps://github.com/inferjay/AndroidDevToolsbundle版集成環境win7jdk(JAVA環