今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。
(1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beauties> <beauty> <name>范冰冰</name> <age>28</age> </beauty> <beauty> <name>杨幂</name> <age>23</age> </beauty> </beauties>
package com.pulltest; public class Beauty { //美女姓名 private String name; //美女年龄 private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "美女资料 [年龄=" + age + ", 姓名=" + name + "]"; } }
package com.pulltest; import java.io.InputStream; import java.util.List; public interface IBeautyParser { /** * * 解析输入流,获取Beauty列表 * @param is * @return * @throws Exception */ public List<Beauty> parse(InputStream is) throws Exception; /** * * 序列化Beauty对象集合,得到XML形式的字符串 * @param beauties * @return * @throws Exception */ public String serialize(List<Beauty> beauties) throws Exception; }
package com.pulltest; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; public class BeautyParserImpl implements IBeautyParser{ @Override public List<Beauty> parse(InputStream is) throws Exception { List<Beauty> mList = null; Beauty beauty = null; // 由android.util.Xml创建一个XmlPullParser实例 XmlPullParser xpp = Xml.newPullParser(); // 设置输入流 并指明编码方式 xpp.setInput(is,"UTF-8"); // 产生第一个事件 int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT){ switch (eventType) { // 判断当前事件是否为文档开始事件 case XmlPullParser.START_DOCUMENT: mList = new ArrayList<Beauty>(); // 初始化books集合 break; // 判断当前事件是否为标签元素开始事件 case XmlPullParser.START_TAG: if (xpp.getName().equals("beauty")) { // 判断开始标签元素是否是book beauty = new Beauty(); } else if (xpp.getName().equals("name")) { eventType = xpp.next();//让解析器指向name属性的值 // 得到name标签的属性值,并设置beauty的name beauty.setName(xpp.getText()); } else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是book eventType = xpp.next();//让解析器指向age属性的值 // 得到age标签的属性值,并设置beauty的age beauty.setAge(xpp.getText()); } break; // 判断当前事件是否为标签元素结束事件 case XmlPullParser.END_TAG: if (xpp.getName().equals("beauty")) { // 判断结束标签元素是否是book mList.add(beauty); // 将book添加到books集合 beauty = null; } break; } // 进入下一个元素并触发相应事件 eventType = xpp.next(); } return mList; } @Override public String serialize(List<Beauty> beauties) throws Exception { // TODO Auto-generated method stub return null; } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
package com.pulltest; import java.io.InputStream; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import com.example.pulltest.R; public class PullTestActivity extends Activity{ //装载Beauty类型的链表,其内容由XML文件解析得到 private List<Beauty> beautyList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pulltest); try { //通过assertmanager的open方法获取到beauties.xml文件的输入流 InputStream is = this.getAssets().open("beauties.xml"); //初始化自定义的实现类BeautyParserImpl BeautyParserImpl pbp = new BeautyParserImpl(); //调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList beautyList = pbp.parse(is); } catch (Exception e) { e.printStackTrace(); } setupViews(); } /** * 将数据显示到手机界面上 */ private void setupViews(){ String result = ""; for (Beauty b : beautyList) { result += b.toString(); } TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); } }
完整的实例代码下载地址:
Android之PULL解析XML