初涉XML解析

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();


運行效果:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章