Extensible Markup Language (XML) 是一組將文檔編碼成機器可讀形式的規則,也是一種在網絡上共享數據的普遍格式。經常更新內容的網站比如新聞網站和博客上都提供XML feed來記錄更新的信息,以便用戶進行訂閱讀取。
解析器我們用XMLPullParser ,Android 官網推薦。如果對xml不熟悉可以先看下http://www.w3cschool.cc/xml/xml-tutorial.html;
今天寫的demo是基於上次的AsyncTask之下載HTML的擴充 ,首先我寫了一個persons.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>Tom</name>
<age>21</age>
</person>
<person id="2">
<name>Rose</name>
<age>22</age>
</person>
<person id="3">
<name>Jack</name>
<age>20</age>
</person>
</persons>
之後我把它上傳到了七牛雲存儲,地址http://carousel.qiniudn.com/persons.xml,可以直接點擊查看,下載。
接下來在工程下寫一個Person JavaBean:
public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private Integer id;
private String name;
private Short age;
}
在MainActivity加入 readXML():
public List<Person> readXML(InputStream inStream) {
// Log.i("LIST", "startReadXML");
//創建解析器對象,生成實例
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(inStream, "UTF-8");// 設置數據源編碼
int eventType = parser.getEventType();// 獲取事件類型
Person currentPerson = null;
List<Person> persons = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:// 文檔開始事件,可以進行數據初始化處理
persons = new ArrayList<Person>();// 實例化集合類
break;
case XmlPullParser.START_TAG:// 開始讀取某個標籤
// 通過getName判斷讀到哪個標籤,然後通過nextText()獲取文本節點值,或通過getAttributeValue(i)獲取屬性節點值
String name = parser.getName();
if (name.equalsIgnoreCase("person")) {
currentPerson = new Person();
currentPerson.setId(new Integer(parser
.getAttributeValue(null, "id")));
} else if (currentPerson != null) {
if (name.equalsIgnoreCase("name")) {
currentPerson.setName(parser.nextText());// 如果後面是Text元素,即返回它的值
Log.i("LIST", currentPerson.getName());
} else if (name.equalsIgnoreCase("age")) {
currentPerson.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:// 結束元素事件
// 讀完一個Person,可以將其添加到集合類中
if (parser.getName().equalsIgnoreCase("person")
&& currentPerson != null) {
persons.add(currentPerson);
currentPerson = null;
}
break;
}
eventType = parser.next();
}
inStream.close();
return persons;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
對於上次的downloadUrL() 末尾一點改動:
//獲取InputSream
is = conn.getInputStream();
//把InputStream 轉爲 String
// String contentAsString = readIt(is, len);
StringBuilder strBuilder = new StringBuilder();
List<Person> list = readXML(is);
for (int i = 0; i < list.size(); i++) {
strBuilder.append("id:" + list.get(i).getId() + "\n");
strBuilder.append("name:" + list.get(i).getName() + "\n");
strBuilder.append("age:" + list.get(i).getAge() + "\n");
strBuilder.append("==========\n");
}
return strBuilder.toString();