除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
下面列出需要解析的XML文件,保存在Android的assets目录下:
<?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.example.xmlpullparse; public class PersonBean { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.example.xmlpullparse; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import com.example.xmlsaxparse.R; import android.app.Activity; import android.os.Bundle; import android.util.Xml; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private String notice = ""; private InputStream inStream; private PersonBean currentPerson = null; private List<PersonBean> persons = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.test); try { inStream = this.getAssets().open("test.xml"); } catch (IOException e) { e.printStackTrace(); } persons = readXML(inStream); for (int i = 0; i < persons.size(); i++) { notice += persons.get(i).getName() + persons.get(i).getAge(); } textView.setText(notice); } public List<PersonBean> readXML(InputStream inStream) { XmlPullParser parser = Xml.newPullParser(); try { parser.setInput(inStream,"UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理 persons = new ArrayList<PersonBean>(); break; case XmlPullParser.START_TAG:// 开始元素事件 String name = parser.getName(); if (name.equalsIgnoreCase("person")) { currentPerson = new PersonBean(); currentPerson.setId(Integer.valueOf(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:// 结束元素事件 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; } }