用PULL解析器解析XML文件

前端之家收集整理的这篇文章主要介绍了用PULL解析器解析XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值):

  1. package lee.service;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.xmlpull.v1.XmlPullParser;
  6. import android.util.Xml;
  7. import lee.vo.Person;
  8. public class XMLPullService {
  9. public List<Person> readXML(InputStream inStream) throws Exception{
  10. List<Person> persons = null;
  11. Person person = null;
  12. XmlPullParser pullParser = Xml.newPullParser(); //获取Pull解析器 Xml.newPullParser()添加一个pullParser解析器带命名空间的支持
  13. pullParser.setInput(inStream,"UTF-8"); //设置Pull解析器进行解析的XML内容
  14. int event = pullParser.getEventType(); //获取第一个事件
  15. while(event!=XmlPullParser.END_DOCUMENT) //如果还不是结束文档事件,迭代每一个元素
  16. {
  17. switch (event)
  18. {
  19. case XmlPullParser.START_DOCUMENT: //开始文档事件
  20. persons = new ArrayList<Person>();
  21. break;
  22. case XmlPullParser.START_TAG: //开始元素事件
  23. if("person".equals(pullParser.getName())) //pullParser.getName()得到当前指针所指向的节点的名称
  24. {
  25. person = new Person();
  26. int id = new Integer(pullParser.getAttributeValue(0));
  27. person.setId(id);
  28. }
  29. if(person!=null)
  30. {
  31. if("name".equals(pullParser.getName()))
  32. {
  33. String name = pullParser.nextText(); //得到当前节点下一个文本节点的内容------> <name>liming</name> 得到liming
  34. person.setName(name);
  35. }
  36. else if("age".equals(pullParser.getName()))
  37. {
  38. String age = pullParser.nextText(); //获取下一个Text类型节点的值
  39. person.setAge(new Short(age));
  40. }
  41. }
  42. break;
  43. case XmlPullParser.END_TAG: //结束元素事件
  44. if("person".equals(pullParser.getName()))
  45. {
  46. persons.add(person);
  47. person = null;
  48. }
  49. break;
  50. }
  51. event = pullParser.next(); //进入下一个元素并触发相应事件
  52. }
  53. return persons;
  54. }
  55. }
第二种方式(较为复杂,用pullparser.Next()来进入下一个元素,用.textNext来返回当前String类型元素的值):

  1. public class PullXmlActivity extends Activity{
  2. private List<Book> list=null;
  3. private PullXmlAdapter adapter;
  4. private ListView lv;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. // TODO Auto-generated method stub
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.listview);
  10. lv=(ListView)findViewById(R.id.listView);
  11. InputStream in;
  12. try {
  13. in = this.getAssets().open("books.xml");
  14. list=pullxml(in);
  15. } catch (IOException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. } catch (Exception e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. }
  22. adapter=new PullXmlAdapter(PullXmlActivity.this,list);
  23. lv.setAdapter(adapter);
  24. }
  25. /**xml文件获取
  26. * 1.xml文件放在res的xml文件夹下(推荐)使用XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX);
  27. * 2.xml文件放在raw的xml文件夹下使用InputStream inputStream =this.getResources().openRawResource(R.raw.XXX);
  28. * 3.xml文件放在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>,
  29. * 否则解析报错,具体原因未查明:InputStream inputStream = getResources().getAssets().open(fileName);
  30. * 4.xml文件放在SD卡, path路径根据实际项目修改,此次获取SDcard根目录:
  31. * String path = Environment.getExternalStorageDirectory().toString();
  32. * File xmlFlie = new File(path+fileName);
  33. * InputStream inputStream = new FileInputStream(xmlFlie);
  34. */
  35. public List<Book> pullxml(InputStream in)throws Exception{
  36. List<Book> list=null;
  37. Book book = null;
  38. // 由android.util.Xml创建一个XmlPullParser实例
  39. XmlPullParser parser = Xml.newPullParser();
  40. // 设置输入流 并指明编码方式
  41. parser.setInput(in,"UTF-8");
  42. // 产生第一个事件
  43. int eventType = parser.getEventType();
  44. while (eventType != XmlPullParser.END_DOCUMENT) {
  45. switch (eventType) {
  46. // 判断当前事件是否为文档开始事件
  47. case XmlPullParser.START_DOCUMENT:
  48. list=new ArrayList<Book>();// 初始化list集合
  49. break;
  50. // 判断当前事件是否为标签元素开始事件
  51. case XmlPullParser.START_TAG:
  52. if (parser.getName().equals("book")) { // 判断开始标签元素是否是book
  53. book = new Book();
  54. } else if (parser.getName().equals("id")) {
  55. eventType = parser.next();
  56. // 得到book标签属性值,并设置book的id
  57. book.setId(Integer.parseInt(parser.getText()));
  58. } else if (parser.getName().equals("name")) { // 判断开始标签元素是否是book
  59. eventType = parser.next();
  60. book.setName(parser.getText());
  61. } else if (parser.getName().equals("price")) { // 判断开始标签元素是否是price
  62. eventType = parser.next();
  63. book.setPrice(Float.parseFloat(parser.getText()));
  64. }
  65. break;
  66. // 判断当前事件是否为标签元素结束事件
  67. case XmlPullParser.END_TAG:
  68. if (parser.getName().equals("book")) { // 判断结束标签元素是否是book
  69. list.add(book); // 将book添加到books集合
  70. book = null;
  71. }
  72. break;
  73. }
  74. // 进入下一个元素并触发相应事件
  75. eventType = parser.next();
  76. }
  77. return list;
  78. }
  79. }

猜你在找的XML相关文章