在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的。本文中将使用XmlPullParser来解析,分别解析不同复杂度的test1.xml、test2.xml、test3.xml。代码如下:

MainActivity:

  1. package com.home.xmlparsetest;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import org.xmlpull.v1.XmlPullParser;
  9.  
  10. import android.app.Activity;
  11. import android.os.Bundle;
  12. import android.util.Xml;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.ExpandableListView;
  17.  
  18. public class MainActivity extends Activity implements OnClickListener {
  19. private Button parseBtn1;
  20. private Button parseBtn2;
  21. private Button parseBtn3;
  22. private ExpandableListView listView;
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.main);
  28. initWidget();
  29. }
  30.  
  31. private void initWidget() {
  32. parseBtn1 = (Button) findViewById(R.id.main_btn_test1);
  33. parseBtn1.setOnClickListener(this);
  34. parseBtn2 = (Button) findViewById(R.id.main_btn_test2);
  35. parseBtn2.setOnClickListener(this);
  36. parseBtn3 = (Button) findViewById(R.id.main_btn_test3);
  37. parseBtn3.setOnClickListener(this);
  38. listView = (ExpandableListView) findViewById(R.id.list);
  39. }
  40.  
  41. @Override
  42. public void onClick(View v) {
  43. if (v == parseBtn1) {
  44. InputStream is = getAssetsStream("test1.xml");
  45. List<ClassBean> list = parseFile1(is);
  46. listView.setAdapter(new MyAdapter(this, list));
  47. } else if (v == parseBtn2) {
  48. InputStream is = getAssetsStream("test2.xml");
  49. List<ClassBean> list = parseFile2(is);
  50. listView.setAdapter(new MyAdapter(this, list));
  51. } else if (v == parseBtn3) {
  52. InputStream is = getAssetsStream("test3.xml");
  53. List<ClassBean> list = parseFile3(is);
  54. listView.setAdapter(new MyAdapter(this, list));
  55. }
  56. }
  57.  
  58. /**
  59. * 得到Assets里面相应的文件流
  60. *
  61. * @param fileName
  62. * @return
  63. */
  64. private InputStream getAssetsStream(String fileName) {
  65. InputStream is = null;
  66. try {
  67. is = getAssets().open(fileName);
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. return is;
  72. }
  73.  
  74. /**
  75. * 解析test1.xml
  76. *
  77. * @param is
  78. * @return list
  79. */
  80. private List<ClassBean> parseFile1(InputStream is) {
  81. List<ClassBean> list = new ArrayList<ClassBean>();
  82. try {
  83. XmlPullParser parser = Xml.newPullParser();
  84. parser.setInput(is, "utf-8");
  85. int event = parser.getEventType();
  86. while (event != XmlPullParser.END_DOCUMENT) {
  87. switch (event) {
  88. case XmlPullParser.START_DOCUMENT:
  89. break;
  90. case XmlPullParser.START_TAG:
  91. if ("class".equals(parser.getName())) {
  92. ClassBean bean = new ClassBean();
  93. bean.setId(parser.getAttributeValue(0));
  94. bean.setName(parser.nextText());
  95. list.add(bean);
  96. }
  97. break;
  98. }
  99. event = parser.next();
  100. }
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. return list;
  105. }
  106.  
  107. /**
  108. * 解析test2.xml
  109. *
  110. * @param is
  111. * @return list
  112. */
  113. private List<ClassBean> parseFile2(InputStream is) {
  114. List<ClassBean> list = null;
  115. ClassBean bean = null;
  116. List<StudentBean> sList = null;
  117. StudentBean be = null;
  118. try {
  119. XmlPullParser parser = Xml.newPullParser();
  120. parser.setInput(is, "utf-8");
  121. int event = parser.getEventType();
  122. while (event != XmlPullParser.END_DOCUMENT) {
  123. switch (event) {
  124. case XmlPullParser.START_DOCUMENT:
  125. list = new ArrayList<ClassBean>();
  126. break;
  127. case XmlPullParser.START_TAG:
  128. if ("class".equals(parser.getName())) {
  129. bean = new ClassBean();
  130. bean.setId(parser.getAttributeValue(0));
  131. bean.setName(parser.getAttributeValue(1));
  132. sList = new ArrayList<StudentBean>();
  133. } else if ("student".equals(parser.getName())) {
  134. be = new StudentBean();
  135. be.setId(parser.getAttributeValue(0));
  136. be.setName(parser.nextText());
  137. sList.add(be);
  138. }
  139. break;
  140. case XmlPullParser.END_TAG:
  141. if ("class".equals(parser.getName())) {
  142. bean.setList(sList);
  143. list.add(bean);
  144. bean = null;
  145. }
  146. break;
  147. }
  148. event = parser.next();
  149. }
  150. } catch (Exception e) {
  151. e.printStackTrace();
  152. }
  153. return list;
  154. }
  155.  
  156. /**
  157. * 解析test3.xml
  158. *
  159. * @param is
  160. * @return list
  161. */
  162. private List<ClassBean> parseFile3(InputStream is) {
  163. List<ClassBean> list = null;
  164. ClassBean bean = null;
  165. List<StudentBean> sList = null;
  166. StudentBean be = null;
  167. try {
  168. XmlPullParser parser = Xml.newPullParser();
  169. parser.setInput(is, "utf-8");
  170. int event = parser.getEventType();
  171. while (event != XmlPullParser.END_DOCUMENT) {
  172. switch (event) {
  173. case XmlPullParser.START_DOCUMENT:
  174. list = new ArrayList<ClassBean>();
  175. break;
  176. case XmlPullParser.START_TAG:
  177. if ("class".equals(parser.getName())) {
  178. bean = new ClassBean();
  179. bean.setId(parser.getAttributeValue(0));
  180. bean.setName(parser.getAttributeValue(1));
  181. sList = new ArrayList<StudentBean>();
  182. } else if ("student".equals(parser.getName())) {
  183. be = new StudentBean();
  184. be.setId(parser.getAttributeValue(0));
  185. sList.add(be);
  186. } else if ("name".equals(parser.getName())) {
  187. be.setName(parser.nextText());
  188. } else if ("sex".equals(parser.getName())) {
  189. be.setSex(parser.nextText());
  190. }
  191. break;
  192. case XmlPullParser.END_TAG:
  193. if ("class".equals(parser.getName())) {
  194. bean.setList(sList);
  195. list.add(bean);
  196. bean = null;
  197. }
  198. break;
  199. }
  200. event = parser.next();
  201. }
  202. } catch (Exception e) {
  203. e.printStackTrace();
  204. }
  205. return list;
  206. }
  207. }

MyAdapter:

  1. package com.home.xmlparsetest;
  2.  
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.view.Gravity;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.BaseExpandableListAdapter;
  9. import android.widget.LinearLayout;
  10. import android.widget.TextView;
  11.  
  12. public class MyAdapter extends BaseExpandableListAdapter {
  13. private List<ClassBean> classList;
  14. private Context context;
  15.  
  16. public MyAdapter(Context context, List<ClassBean> classList) {
  17. this.context = context;
  18. this.classList = classList;
  19. }
  20.  
  21. @Override
  22. public Object getChild(int groupPosition, int childPosition) {
  23. List<StudentBean> sList = classList.get(groupPosition).getList();
  24. StudentBean be = null;
  25. if (sList != null) {
  26. be = sList.get(childPosition);
  27. }
  28. return be;
  29. }
  30.  
  31. @Override
  32. public long getChildId(int groupPosition, int childPosition) {
  33. return childPosition;
  34. }
  35.  
  36. @Override
  37. public View getChildView(int groupPosition, int childPosition,
  38. boolean isLastChild, View convertView, ViewGroup parent) {
  39. LinearLayout ll = new LinearLayout(context);
  40. ll.setOrientation(LinearLayout.HORIZONTAL);
  41. List<StudentBean> sList = classList.get(groupPosition).getList();
  42.  
  43. if (sList != null && sList.size() > 0
  44. && sList.get(childPosition).getId() != null) {
  45. TextView tv1 = getTextView2();
  46. tv1.setText(sList.get(childPosition).getId());
  47. ll.addView(tv1);
  48. }
  49.  
  50. if (sList != null && sList.size() > 0
  51. && sList.get(childPosition).getName() != null) {
  52. TextView tv2 = getTextView2();
  53. tv2.setText(sList.get(childPosition).getName());
  54. ll.addView(tv2);
  55. }
  56.  
  57. if (sList != null && sList.size() > 0
  58. && sList.get(childPosition).getSex() != null) {
  59. TextView tv3 = getTextView2();
  60. tv3.setText(sList.get(childPosition).getSex());
  61. ll.addView(tv3);
  62. }
  63. return ll;
  64. }
  65.  
  66. @Override
  67. public int getChildrenCount(int groupPosition) {
  68. int size = 0;
  69. List<StudentBean> sList = classList.get(groupPosition).getList();
  70. if (sList != null) {
  71. size = sList.size();
  72. }
  73. return size;
  74. }
  75.  
  76. @Override
  77. public Object getGroup(int groupPosition) {
  78. return classList.get(groupPosition);
  79. }
  80.  
  81. @Override
  82. public int getGroupCount() {
  83. return classList.size();
  84. }
  85.  
  86. @Override
  87. public long getGroupId(int groupPosition) {
  88. return groupPosition;
  89. }
  90.  
  91. @Override
  92. public View getGroupView(int groupPosition, boolean isExpanded,
  93. View convertView, ViewGroup parent) {
  94. LinearLayout ll = new LinearLayout(context);
  95. ll.setOrientation(LinearLayout.HORIZONTAL);
  96. TextView tv1 = getTextView1();
  97. tv1.setText(classList.get(groupPosition).getId());
  98. ll.addView(tv1);
  99.  
  100. TextView tv2 = getTextView1();
  101. tv2.setText(classList.get(groupPosition).getName());
  102. ll.addView(tv2);
  103. return ll;
  104. }
  105.  
  106. @Override
  107. public boolean hasStableIds() {
  108. return true;
  109. }
  110.  
  111. @Override
  112. public boolean isChildSelectable(int groupPosition, int childPosition) {
  113. return true;
  114. }
  115.  
  116. private TextView getTextView1() {
  117. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
  118. ViewGroup.LayoutParams.WRAP_CONTENT,
  119. ViewGroup.LayoutParams.WRAP_CONTENT);
  120. lp.setMargins(0, 0, 20, 0);
  121. TextView tv = new TextView(context);
  122. tv.setLayoutParams(lp);
  123. tv.setGravity(Gravity.CENTER_VERTICAL);
  124. tv.setPadding(36, 0, 0, 0);
  125. tv.setTextSize(25);
  126. return tv;
  127. }
  128.  
  129. private TextView getTextView2() {
  130. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
  131. ViewGroup.LayoutParams.WRAP_CONTENT,
  132. ViewGroup.LayoutParams.WRAP_CONTENT);
  133. lp.setMargins(20, 0, 50, 0);
  134. TextView tv = new TextView(context);
  135. tv.setLayoutParams(lp);
  136. tv.setGravity(Gravity.CENTER_VERTICAL);
  137. tv.setPadding(36, 0, 0, 0);
  138. tv.setTextSize(18);
  139. return tv;
  140. }
  141. }

ClassBean实体类:

  1. package com.home.xmlparsetest;
  2.  
  3. import java.util.List;
  4.  
  5. public class ClassBean {
  6. private String id;
  7. private String name;
  8. private List<StudentBean> list;
  9.  
  10. public String getId() {
  11. return id;
  12. }
  13.  
  14. public void setId(String id) {
  15. this.id = id;
  16. }
  17.  
  18. public String getName() {
  19. return name;
  20. }
  21.  
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25.  
  26. public List<StudentBean> getList() {
  27. return list;
  28. }
  29.  
  30. public void setList(List<StudentBean> list) {
  31. this.list = list;
  32. }
  33.  
  34. }

StudentBean:

  1. package com.home.xmlparsetest;
  2.  
  3. public class StudentBean {
  4. private String id;
  5. private String name;
  6. private String sex;
  7.  
  8. public String getId() {
  9. return id;
  10. }
  11.  
  12. public void setId(String id) {
  13. this.id = id;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23.  
  24. public String getSex() {
  25. return sex;
  26. }
  27.  
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31.  
  32. }

布局文件main.xml:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical" >
  5.  
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:orientation="horizontal" >
  10.  
  11. <Button
  12. android:id="@+id/main_btn_test1"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_weight="1"
  16. android:text="解析test1" />
  17.  
  18. <Button
  19. android:id="@+id/main_btn_test2"
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content"
  22. android:layout_weight="1"
  23. android:text="解析test2" />
  24.  
  25. <Button
  26. android:id="@+id/main_btn_test3"
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:layout_weight="1"
  30. android:text="解析test3" />
  31. </LinearLayout>
  32.  
  33. <ExpandableListView
  34. android:id="@+id/list"
  35. android:layout_width="match_parent"
  36. android:layout_height="wrap_content" >
  37. </ExpandableListView>
  38.  
  39. </LinearLayout>

assets里面的test1.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <classList>
  3.  
  4. <class id="1">一班</class>
  5.  
  6. <class id="2">二班</class>
  7.  
  8. <class id="3">三班</class>
  9.  
  10. <class id="4">四班</class>
  11.  
  12. </classList>

assets里面的test2.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <classList>
  3.  
  4. <class id="1" name="一班" >
  5. <student id="1" >张三 </student>
  6. <student id="2" >李四 </student>
  7. </class>
  8.  
  9. <class id="2" name="二班" >
  10. <student id="3" >王五</student>
  11. <student id="4" >赵六</student>
  12. </class>
  13.  
  14. <class id="3" name="三班" >
  15. <student id="5" >小明</student>
  16. <student id="6" >小高 </student>
  17. </class>
  18.  
  19. <class id="4" name="四班" >
  20. <student id="7" >小花</student>
  21. <student id="8" >小红 </student>
  22. </class>
  23.  
  24. </classList>

assets里面的test3.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <classList>
  3.  
  4. <class id="1" name="一班" >
  5. <student id="1" >
  6. <name>张三</name>
  7. <sex></sex>
  8. </student>
  9. <student id="2" >
  10. <name>李四</name>
  11. <sex></sex>
  12. </student>
  13. </class>
  14.  
  15. <class id="2" name="二班" >
  16. <student id="3" >
  17. <name>王五</name>
  18. <sex></sex>
  19. </student>
  20. <student id="4" >
  21. <name>赵六</name>
  22. <sex></sex>
  23. </student>
  24. </class>
  25.  
  26. <class id="3" name="三班" >
  27. <student id="5" >
  28. <name>小明</name>
  29. <sex></sex>
  30. </student>
  31. <student id="6" >
  32. <name>小高</name>
  33. <sex></sex>
  34. </student>
  35. </class>
  36.  
  37. <class id="4" name="四班" >
  38. <student id="7" >
  39. <name>小花</name>
  40. <sex></sex>
  41. </student>
  42. <student id="8" >
  43. <name>小红</name>
  44. <sex></sex>
  45. </student>
  46. </class>
  47.  
  48. </classList>

http://www.tuicool.com/articles/EZrqEb

android 中解析XML的方法(转)的更多相关文章

  1. Android中解析XML的方法

    假设我要解析如下的XML文件: <?xml version="1.0" encoding="UTF-8"?> <books> <b ...

  2. Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  3. [置顶] Android学习系列-Android中解析xml(7)

    Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件.   ...

  4. Android中解析XML

    XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...

  5. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  6. Android DOM解析XML方法及优化

    在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML ...

  7. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  8. 【转】Android中JNI的使用方法

    Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...

  9. 修改Android中strings.xml文件, 动态改变数据

    有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...

随机推荐

  1. vc++ 获取当前用户名

    #include<afxwin.h> #include <stdio.h> int main(void) { char userName[MAX_PATH]; unsigned ...

  2. acdream1116 Gao the string!(hash二分 or 后缀数组)

    问题套了一个斐波那契数,归根结底就是要求对于所有后缀s[i...n-1],所有前缀在其中出现的总次数.我一开始做的时候想了好久,后来看了别人的解法才恍然大悟.对于一个后缀来说 s[i...n-1]来说 ...

  3. [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

    发布日期:2009.12.29 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码 ...

  4. (3)初次接触off

    boss布置任务了,要读入off文件,生成能显示出来的可执行文件,完成不了就要滚蛋 目前的东西还是不用保密的,到后面我就要设密码了 好,.off文件是什么? OFF,Object File Forma ...

  5. 最近工作用到的sql脚本

    USE MadeInChina DUMP TRANSACTION MadeInChina WITH NO_LOG --清除日志 BACKUP LOG MadeInChina WITH NO_LOG B ...

  6. python流程控制语句 ifelse - 4

    嵌套 #! /usr/bin/python a = int(input ("请输入一个整数:")) : : print ("无法显示") else : prin ...

  7. DWR与AJAX

    DWR与AJAX的微妙关系 2015-08-14 10:20 447人阅读 评论(0) 收藏 举报 本文章已收录于:   // ' + obj.name + "  "; html ...

  8. oracle服务、客户端 plsql配置

    1.oracle服务端安装 Oracle 9i 的安装(图解) 2.oracle客户端安装 http://wenku.baidu.com/view/8be28581f524ccbff0218427.h ...

  9. 练习用php做表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Windows API 进程状态信息函数

    这里的进程状态信息函数主要分为两类,一类是PS(PROCESS STATUS HELPER) API,另外一类是Th(TOOL HELP) API. 话说第一次遇到这个ToolHelp函数时我在看&l ...