XML解析三種方式
DOM
通用性強,它會將XML文件的所有內容讀取到內存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數據;
簡單直觀,但需要將文檔讀取到內存,並不太適合移動設備;
SAX
SAX是一個解析速度快並且占用內存少的xml解析器;
采用事件驅動,它並不需要解析整個文檔;
實現:繼承DefaultHandler,覆寫startElement、endElement、characters等方法;
PULL
Android自帶的XML解析器,和SAX基本類似,也是事件驅動,不同的是PULL事件返回的是數值型;推薦使用。
PULL解析XML核心代碼
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setInput(fileInputStream, “utf-8”);//設置數據源編碼
- int eventCode = parser.getEventType();//獲取事件類型
- while(eventCode != XmlPullParser.END_DOCUMENT) {
- switch (eventCode){
- case XmlPullParser.START_DOCUMENT: //開始讀取XML文檔
- //實例化集合類
- break;
- case XmlPullParser.START_TAG://開始讀取某個標簽
- if("person".equals(parser.getName())) {
- //通過getName判斷讀到哪個標簽,然后通過nextText()獲取文本節點值,或通過getAttributeValue(i)獲取屬性節點值
- }
- break;
- case XmlPullParser.END_TAG://讀完一個Person,可以將其添加到集合類中
- break;
- }
- parser.next();
- }
PULL解析XML示例方法
Java方法
- public static List<Person> readXML(InputStream inStream) {
- 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元素,即返回它的值
- } 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;
- }
應用
XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>孫洋洋</name>
- <age>30</age>
- </person>
- <person id="20">
- <name>孫彬彬</name>
- <age>25</age>
- </person>
- </persons>
- package com.app.data;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStreamWriter;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- import com.app.other.Person;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Xml;
- import android.widget.TextView;
- public class XMLActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_xml);
- StringBuilder sBuilder = new StringBuilder();
- File xmlFile = new File("/mnt/sdcard/App/person.xml");
- try {
- FileInputStream inputStream = new FileInputStream(xmlFile);
- // URL url = new URL("http://10.0.2.2:8888/android/person.xml");
- // HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
- // InputStream inputStream = urlConnection.getInputStream();
- List<Person> list = readXML(inputStream);
- for (int i = 0; i < list.size(); i++) {
- Person person = list.get(i);
- sBuilder.append("第-" + i + "-條記錄:\n");
- sBuilder.append("getName--" + person.getName() + "\n");
- sBuilder.append("getAge--" + person.getAge() + "\n");
- sBuilder.append("getId--" + person.getId() + "\n");
- }
- inputStream.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- TextView textView = (TextView)findViewById(R.id.textView2);
- textView.setText(sBuilder);
- }
- public static List<Person> readXML(InputStream inStream) {
- 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元素,即返回它的值
- } 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;
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="15dp" >
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="XML文件讀取"
- android:layout_gravity="center_horizontal" />
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView" />
- </LinearLayout>

執行結果:
