1、该项目主要有下面的两个作用

(1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据

(2)强list对象保存成xml文件,xml保存到手机的内存卡上

Android项目也是采用mvc的框架

在手机的存储空间中保存wy目录下了存在person.xml文件

  1. <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
  2. <Persons>
  3. <person id="23">
  4. <name>wee</name>
  5. <age>21</age>
  6. </person>
  7. <person id="24">
  8. <name>wee4</name>
  9. <age>24</age>
  10. </person>
  11. <person id="23">
  12. <name>wee5</name>
  13. <age>27</age>
  14. </person>
  15. </Persons>

我们要对这个xml文件进行解析

我们要看解析的业务类:

  1. package contract.test.service;
  2.  
  3. import android.content.Context;
  4. import android.util.Log;
  5. import android.util.Xml;
  6. import android.widget.Toast;
  7.  
  8. import org.xml.sax.helpers.XMLReaderFactory;
  9. import org.xmlpull.v1.XmlPullParser;
  10. import org.xmlpull.v1.XmlPullParserException;
  11. import org.xmlpull.v1.XmlPullParserFactory;
  12. import org.xmlpull.v1.XmlSerializer;
  13.  
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. import java.io.OutputStream;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19.  
  20. import contract.test.domain.Person;
  21.  
  22. public class XmlPullParse {
  23.  
  24. private Context context;
  25. private List<Person> persons = null;
  26. Person person = null;
  27.  
  28. public XmlPullParse(Context context) {
  29.  
  30. this.context = context;
  31. }
  32.  
  33. public List<Person> xmlPullParse(InputStream xml) throws Exception {
  34.  
  35. /* *//*兴建一个pull解析器*//*
  36. XmlPullParser xmlPullParse = XmlPullParserFactory.newInstance().newPullParser();
  37. //设置解析器的输入流及其解析格式
  38. xmlPullParse.setInput(xml, "UTF-8");
  39. Log.i("weiyuan", "23232223");
  40. int envetType = xmlPullParse.getEventType();
  41. Toast.makeText(context, "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
  42. while (envetType != xmlPullParse.END_DOCUMENT) {
  43. *//*解析到了文档的开始:<?xml version="1.0" encoding="UTF-8"?> *//*
  44. if (envetType == xmlPullParse.START_DOCUMENT) {
  45. persons = new ArrayList<Person>();
  46. }
  47.  
  48. *//* 元素节点开始*//*
  49. if (envetType == xmlPullParse.START_TAG) {
  50.  
  51. if ("person".equals(xmlPullParse.getName())) {
  52. person = new Person();
  53. int id = new Integer(xmlPullParse.getAttributeName(0));
  54. person.setId(id);
  55. }
  56. if ("name".equals(xmlPullParse.getName())) {
  57. String name = xmlPullParse.nextText();
  58. person.setName(name);
  59. }
  60. if ("age".equals(xmlPullParse.getName())) {
  61. int age = new Integer(xmlPullParse.nextText());
  62. person.setAge(age);
  63. }
  64.  
  65. }
  66. if(envetType==xmlPullParse.END_TAG)
  67. {
  68. if("person".equals(xmlPullParse.getName()))
  69. {
  70. persons.add(person);
  71. person = null;
  72. }
  73. }
  74.  
  75. envetType = xmlPullParse.next();
  76.  
  77. }
  78.  
  79. Toast.makeText(context, "535335!", Toast.LENGTH_LONG).show();
  80.  
  81. return persons;
  82. }*/
  83. List<Person> persons = null;
  84. Person person = null;
  85. XmlPullParser parser = Xml.newPullParser();//得到解析器
  86. parser.setInput(xml, "UTF-8");//xml编码的utf-8格式
  87. int eventType = parser.getEventType();//产生第一个事件
  88. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
  89. switch (eventType) {
  90. case XmlPullParser.START_DOCUMENT:
  91. persons = new ArrayList<Person>();
  92. break;
  93.  
  94. case XmlPullParser.START_TAG:
  95. String name = parser.getName();//获取解析器当前指向的元素的名称
  96. if("person".equals(name)){
  97. person = new Person();
  98. person.setId(new Integer(parser.getAttributeValue(0)));//这里0表示当前元素节点只有一个属性值,获得第二个属性值可用
  99. //parser.getAttributeValue(1)
  100. }
  101. if(person!=null){
  102. if("name".equals(name)){
  103. person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
  104. }
  105. if("age".equals(name)){
  106. person.setAge(new Integer(parser.nextText()));
  107. }
  108. }
  109. break;
  110. case XmlPullParser.END_TAG:
  111. if("person".equals(parser.getName())){
  112. persons.add(person);
  113. person = null;
  114. }
  115. break;
  116. }
  117. eventType = parser.next();
  118. }
  119. return persons;
  120.  
  121. }
  122.  
  123. /*保存数据到xml中,保存到sd卡的当前目录下的123.xml中*/
  124. public void saveToXml(OutputStream output,List<Person>persons) throws XmlPullParserException, IOException
  125. {
  126. //建立输出破解器
  127. XmlSerializer xmlSerializer = XmlPullParserFactory.newInstance().newSerializer();
  128. xmlSerializer.setOutput(output,"UTF-8");
  129. xmlSerializer.startDocument("UTF-8",true);
  130.  
  131. xmlSerializer.startTag(null,"Persons");
  132. for(Person person:persons)
  133. {
  134. xmlSerializer.startTag(null,"person");
  135. xmlSerializer.attribute(null,"id", person.getId().toString());
  136. xmlSerializer.startTag(null,"name");
  137. xmlSerializer.text(person.getName());
  138. xmlSerializer.endTag(null,"name");
  139. xmlSerializer.startTag(null,"age");
  140. xmlSerializer.text(person.getAge().toString());
  141. xmlSerializer.endTag(null,"age");
  142.  
  143. xmlSerializer.endTag(null,"person");
  144. }
  145. xmlSerializer.endTag(null,"Persons");
  146. xmlSerializer.endDocument();
  147. output.flush();
  148. output.close();
  149. }
  150.  
  151. }

我们来看下activity的代码:

  1. package contract.test.xmlpullparse;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Environment;
  6. import android.util.Log;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.Toast;
  10.  
  11. import org.xmlpull.v1.XmlPullParserException;
  12.  
  13. import java.io.File;
  14. import java.io.FileInputStream;
  15. import java.io.FileNotFoundException;
  16. import java.io.FileOutputStream;
  17. import java.io.IOException;
  18. import java.io.InputStream;
  19. import java.io.OutputStream;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22.  
  23. import contract.test.domain.Person;
  24. import contract.test.service.XmlPullParse;
  25.  
  26. public class MyActivity extends Activity {
  27.  
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_my);
  32. /*从xml中解析数据*/
  33. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  34.  
  35. Log.i("weiyuan", Environment.getExternalStorageDirectory().getAbsolutePath().toString() + File.separator +
  36. "weiyuan");
  37. /* File file = new File(Environment.getExternalStorageDirectory().toString() +File.separator+"123.xml");*/
  38. /*File file = new File(Environment.getExternalStorageDirectory().toString() +"/weiyuan/person.xml"
  39. );*/
  40. //初始化File
  41. /*几点注意事项
  42. * 1 我是在sd当前目录下自己手动建立了一个wy的文件夹,该该文件夹下新建了一个person.xml的xml文件
  43. * 2 要访问该文件夹下的person.xml文件必须保证高文件夹和该文件是可读写的,一般自己在sd卡上手动建立的文件是
  44. * 受保护的自己要该为不受保护的
  45. *
  46. * <元素 元素属性=xxx> 可以存在多个属性
  47. <元素2>
  48. asdasd
  49. </元素2>
  50. </元素>*/
  51. /*其中asdasd是文本节点,nextText()函数就是获得asdasd的值*/
  52. String path=Environment.getExternalStorageDirectory().toString()
  53. +File.separator
  54. +"wy"
  55. +File.separator
  56. +"person.xml";
  57. File file=new File(path);
  58. if (file.exists()) {
  59. Toast.makeText(getApplicationContext(), "文件夹存在", Toast.LENGTH_LONG).show();
  60. Log.i("weiyuan", Environment.getExternalStorageDirectory().toString() + File.separator +
  61. "weiyuan");
  62. }
  63. else
  64. {Toast.makeText(getApplicationContext(), "文件夹不存在", Toast.LENGTH_LONG).show();
  65.  
  66. try {
  67. file.createNewFile();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. Toast.makeText(getApplicationContext(), "xml文件不存在", Toast.LENGTH_LONG).show();
  72. Log.i("weiyuan", Environment.getExternalStorageDirectory().toString() );
  73. }
  74. try {
  75. InputStream input = new FileInputStream(file);
  76. /*FileInputStream input = new FileInputStream(file);这也是正确的*/
  77.  
  78. XmlPullParse xmlPullParse = new XmlPullParse(getApplicationContext());
  79. try {
  80. List<Person> persons = xmlPullParse.xmlPullParse(input);
  81. for (Person person :persons)
  82. {
  83. Log.i("weiyuan",person.toString());
  84. }
  85. Toast.makeText(getApplicationContext(), "文件解析成功!", Toast.LENGTH_LONG).show();
  86.  
  87. } catch (Exception e) {
  88. e.printStackTrace();
  89. Toast.makeText(getApplicationContext(), "文件解析失败", Toast.LENGTH_LONG).show();
  90. }
  91. } catch (FileNotFoundException e) {
  92. e.printStackTrace();
  93. Toast.makeText(getApplicationContext(), "文件输入流失败!", Toast.LENGTH_LONG).show();
  94. }
  95.  
  96. } else {
  97. Toast.makeText(getApplicationContext(), "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
  98. }
  99.  
  100. /*将数据保存xml文件中*/
  101. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  102. {
  103. File file = new File(Environment.getExternalStorageDirectory().toString()+File.separator+"123.xml");
  104. try {
  105. OutputStream outputStream = new FileOutputStream(file);
  106. XmlPullParse xmlPullParse = new XmlPullParse(getApplicationContext());
  107. List<Person> persons = new ArrayList<Person>();
  108. persons.add(new Person(23,"wee",21));
  109. persons.add(new Person(24,"wee4",24));
  110. persons.add(new Person(23,"wee5",27));
  111. try {
  112. xmlPullParse.saveToXml(outputStream,persons);
  113. Toast.makeText(getApplicationContext(), "数据保存到123.xml中成功!", Toast.LENGTH_LONG).show();
  114. } catch (XmlPullParserException e) {
  115. e.printStackTrace();
  116. } catch (IOException e) {
  117. e.printStackTrace();
  118. }
  119. } catch (FileNotFoundException e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. else
  124. {
  125. Toast.makeText(getApplicationContext(), "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
  126. }
  127.  
  128. }
  129.  
  130. @Override
  131. public boolean onCreateOptionsMenu(Menu menu) {
  132. // Inflate the menu; this adds items to the action bar if it is present.
  133. getMenuInflater().inflate(R.menu.my, menu);
  134. return true;
  135. }
  136.  
  137. @Override
  138. public boolean onOptionsItemSelected(MenuItem item) {
  139. // Handle action bar item clicks here. The action bar will
  140. // automatically handle clicks on the Home/Up button, so long
  141. // as you specify a parent activity in AndroidManifest.xml.
  142. int id = item.getItemId();
  143. if (id == R.id.action_settings) {
  144. return true;
  145. }
  146. return super.onOptionsItemSelected(item);
  147. }
  148. }
  149.  
  150. person类对象的代码是:
  1. package contract.test.domain;
  2.  
  3. public class Person {
  4. private Integer id ; //int 和Integer的最大区别,Integer是类,该类具有透toString方法,可以转换为字符串
  5. private String name ;
  6. private Integer age;
  7.  
  8. public Person(Integer id, String name, Integer age) {
  9. this.id = id;
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public Person()
  14. {
  15.  
  16. }
  17. @Override
  18. public String toString() {
  19. return "Person{" +
  20. "id=" + id +
  21. ", name='" + name + '\'' +
  22. ", age=" + age +
  23. '}';
  24. }
  25.  
  26. public Integer getId() {
  27. return id;
  28. }
  29.  
  30. public void setId(Integer id) {
  31. this.id = id;
  32. }
  33.  
  34. public String getName() {
  35. return name;
  36. }
  37.  
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41.  
  42. public Integer getAge() {
  43. return age;
  44. }
  45.  
  46. public void setAge(Integer age) {
  47. this.age = age;
  48. }
  49. }
  1.  

注意一定不要忘记了sd卡的使用权限

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="contract.test.xmlpullparse" >
  4.  
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@drawable/ic_launcher"
  8. android:label="@string/app_name"
  9. android:theme="@style/AppTheme" >
  10. <activity
  11. android:name=".MyActivity"
  12. android:label="@string/app_name" >
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15.  
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  21. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  22.  
  23. <!-- 在SDCard中创建与删除文件权限 -->
  24. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  25. <!-- 往SDCard写入数据权限 -->
  26. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  27. </manifest>
  1.  

黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容的更多相关文章

  1. 黎活明8天快速掌握android视频教程--20_采用ContentProvider对外共享数据

    1.内容提供者是让当前的app的数据可以让其他应用访问,其他应该可以通过内容提供者访问当前app的数据库 contentProvider的主要目的是提供一个开发的接口,让其他的应该能够访问当前应用的数 ...

  2. 黎活明8天快速掌握android视频教程--19_采用ListView实现数据列表显示

    1.首先整个程序也是采用mvc的框架 DbOpenHelper 类 package dB; import android.content.Context; import android.databas ...

  3. 黎活明8天快速掌握android视频教程--16_采用SharedPreferences保存用户偏好设置参数

    SharedPreferences保存的数据是xml格式,也是存在数据保存的下面四种权限: 我们来看看 我们来看看具体的业务操作类: /** * 文件名:SharedPrecences.java * ...

  4. 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人

    Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...

  5. 黎活明8天快速掌握android视频教程--25_网络通信之资讯客户端

    1 该项目的主要功能是:后台通过xml或者json格式返回后台的视频资讯,然后Android客户端界面显示出来 首先后台新建立一个java web后台 采用mvc的框架 所以的servlet都放在se ...

  6. 黎活明8天快速掌握android视频教程--24_网络通信之网页源码查看器

    1 该项目的主要功能就是从将后台的html网页在Android的界面上显示出来 后台就是建立一个java web工程在工程尚建立一个html或者jsp文件就可以了,这里主要看Android客户端的程序 ...

  7. 黎活明8天快速掌握android视频教程--23_网络通信之网络图片查看器

    1.首先新建立一个java web项目的工程.使用的是myeclipe开发软件 图片的下载路径是http://192.168.1.103:8080/lihuoming_23/3.png 当前手机和电脑 ...

  8. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  9. 黎活明8天快速掌握android视频教程--17_创建数据库与完成数据添删改查

    1.我们首先来看下整个项目 项目也是采用mvc的框架 package dB; import android.content.Context; import android.database.sqlit ...

随机推荐

  1. 几种常见的app推广形式

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. JVM系列.JDK演进历史

    Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...

  3. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...

  4. 【LINQ标准查询操作符总结】之聚合操符

    C#  中的LINQ 提供了两种操作方式,查询表达式和查询操作符,所有的查询表达式都有对应的查操作符类替代,查询表达式有点“类” SQL,在代码中写SQL,总觉得不够“优雅”,使用查询操作符就显得“优 ...

  5. php mysqli使用

    连接到数据库$mysqli = new mysqli(主机,用户,密码,数据库); 选择数据库$mysqli->select_db(数据库);设置编码$mysqli->set_charse ...

  6. ActiveMQ 反序列化漏洞(CVE-2015-5254)复现

    1.运行漏洞环境 sudo docker-compose up -d 环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递:8161是Web管理页面端口.访 ...

  7. golang内置类型和内置函数

    golang内置类型和内置函数是不需要引入包直接可用的 golang内置类型: 数值类型 string int,unint float32,float64 bool array 有长度的 comple ...

  8. MySQL国内镜像下载地址

    最近重新下载MySQL发现官网下载速度不是一般的慢,官网下载要几个钟而且一不注意就被取消下载了,实在受不了 可以使用sohu的镜像:http://mirrors.sohu.com/mysql/MySQ ...

  9. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  10. Java实现 LeetCode 617 合并二叉树(遍历树)

    617. 合并二叉树 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点 ...