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

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

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

Android项目也是采用mvc的框架

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

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<Persons>
<person id="23">
<name>wee</name>
<age>21</age>
</person>
<person id="24">
<name>wee4</name>
<age>24</age>
</person>
<person id="23">
<name>wee5</name>
<age>27</age>
</person>
</Persons>

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

我们要看解析的业务类:

package contract.test.service;

import android.content.Context;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast; import org.xml.sax.helpers.XMLReaderFactory;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import contract.test.domain.Person; public class XmlPullParse { private Context context;
private List<Person> persons = null;
Person person = null; public XmlPullParse(Context context) { this.context = context;
} public List<Person> xmlPullParse(InputStream xml) throws Exception { /* *//*兴建一个pull解析器*//*
XmlPullParser xmlPullParse = XmlPullParserFactory.newInstance().newPullParser();
//设置解析器的输入流及其解析格式
xmlPullParse.setInput(xml, "UTF-8");
Log.i("weiyuan", "23232223");
int envetType = xmlPullParse.getEventType();
Toast.makeText(context, "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
while (envetType != xmlPullParse.END_DOCUMENT) {
*//*解析到了文档的开始:<?xml version="1.0" encoding="UTF-8"?> *//*
if (envetType == xmlPullParse.START_DOCUMENT) {
persons = new ArrayList<Person>();
} *//* 元素节点开始*//*
if (envetType == xmlPullParse.START_TAG) { if ("person".equals(xmlPullParse.getName())) {
person = new Person();
int id = new Integer(xmlPullParse.getAttributeName(0));
person.setId(id);
}
if ("name".equals(xmlPullParse.getName())) {
String name = xmlPullParse.nextText();
person.setName(name);
}
if ("age".equals(xmlPullParse.getName())) {
int age = new Integer(xmlPullParse.nextText());
person.setAge(age);
} }
if(envetType==xmlPullParse.END_TAG)
{
if("person".equals(xmlPullParse.getName()))
{
persons.add(person);
person = null;
}
} envetType = xmlPullParse.next(); } Toast.makeText(context, "535335!", Toast.LENGTH_LONG).show(); return persons;
}*/
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();//得到解析器
parser.setInput(xml, "UTF-8");//xml编码的utf-8格式
int eventType = parser.getEventType();//产生第一个事件
while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break; case XmlPullParser.START_TAG:
String name = parser.getName();//获取解析器当前指向的元素的名称
if("person".equals(name)){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));//这里0表示当前元素节点只有一个属性值,获得第二个属性值可用
//parser.getAttributeValue(1)
}
if(person!=null){
if("name".equals(name)){
person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
}
if("age".equals(name)){
person.setAge(new Integer(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
return persons; } /*保存数据到xml中,保存到sd卡的当前目录下的123.xml中*/
public void saveToXml(OutputStream output,List<Person>persons) throws XmlPullParserException, IOException
{
//建立输出破解器
XmlSerializer xmlSerializer = XmlPullParserFactory.newInstance().newSerializer();
xmlSerializer.setOutput(output,"UTF-8");
xmlSerializer.startDocument("UTF-8",true); xmlSerializer.startTag(null,"Persons");
for(Person person:persons)
{
xmlSerializer.startTag(null,"person");
xmlSerializer.attribute(null,"id", person.getId().toString());
xmlSerializer.startTag(null,"name");
xmlSerializer.text(person.getName());
xmlSerializer.endTag(null,"name");
xmlSerializer.startTag(null,"age");
xmlSerializer.text(person.getAge().toString());
xmlSerializer.endTag(null,"age"); xmlSerializer.endTag(null,"person");
}
xmlSerializer.endTag(null,"Persons");
xmlSerializer.endDocument();
output.flush();
output.close();
} }

我们来看下activity的代码:

package contract.test.xmlpullparse;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; import org.xmlpull.v1.XmlPullParserException; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import contract.test.domain.Person;
import contract.test.service.XmlPullParse; public class MyActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
/*从xml中解析数据*/
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Log.i("weiyuan", Environment.getExternalStorageDirectory().getAbsolutePath().toString() + File.separator +
"weiyuan");
/* File file = new File(Environment.getExternalStorageDirectory().toString() +File.separator+"123.xml");*/
/*File file = new File(Environment.getExternalStorageDirectory().toString() +"/weiyuan/person.xml"
);*/
//初始化File
/*几点注意事项
* 1 我是在sd当前目录下自己手动建立了一个wy的文件夹,该该文件夹下新建了一个person.xml的xml文件
* 2 要访问该文件夹下的person.xml文件必须保证高文件夹和该文件是可读写的,一般自己在sd卡上手动建立的文件是
* 受保护的自己要该为不受保护的
*
* <元素 元素属性=xxx> 可以存在多个属性
<元素2>
asdasd
</元素2>
</元素>*/
/*其中asdasd是文本节点,nextText()函数就是获得asdasd的值*/
String path=Environment.getExternalStorageDirectory().toString()
+File.separator
+"wy"
+File.separator
+"person.xml";
File file=new File(path);
if (file.exists()) {
Toast.makeText(getApplicationContext(), "文件夹存在", Toast.LENGTH_LONG).show();
Log.i("weiyuan", Environment.getExternalStorageDirectory().toString() + File.separator +
"weiyuan");
}
else
{Toast.makeText(getApplicationContext(), "文件夹不存在", Toast.LENGTH_LONG).show(); try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), "xml文件不存在", Toast.LENGTH_LONG).show();
Log.i("weiyuan", Environment.getExternalStorageDirectory().toString() );
}
try {
InputStream input = new FileInputStream(file);
/*FileInputStream input = new FileInputStream(file);这也是正确的*/ XmlPullParse xmlPullParse = new XmlPullParse(getApplicationContext());
try {
List<Person> persons = xmlPullParse.xmlPullParse(input);
for (Person person :persons)
{
Log.i("weiyuan",person.toString());
}
Toast.makeText(getApplicationContext(), "文件解析成功!", Toast.LENGTH_LONG).show(); } catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "文件解析失败", Toast.LENGTH_LONG).show();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "文件输入流失败!", Toast.LENGTH_LONG).show();
} } else {
Toast.makeText(getApplicationContext(), "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
} /*将数据保存xml文件中*/
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File file = new File(Environment.getExternalStorageDirectory().toString()+File.separator+"123.xml");
try {
OutputStream outputStream = new FileOutputStream(file);
XmlPullParse xmlPullParse = new XmlPullParse(getApplicationContext());
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(23,"wee",21));
persons.add(new Person(24,"wee4",24));
persons.add(new Person(23,"wee5",27));
try {
xmlPullParse.saveToXml(outputStream,persons);
Toast.makeText(getApplicationContext(), "数据保存到123.xml中成功!", Toast.LENGTH_LONG).show();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
else
{
Toast.makeText(getApplicationContext(), "文件打开失败或者sdcard写保护!", Toast.LENGTH_LONG).show();
} } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
} person类对象的代码是:
package contract.test.domain;

public class Person {
private Integer id ; //int 和Integer的最大区别,Integer是类,该类具有透toString方法,可以转换为字符串
private String name ;
private Integer age; public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person()
{ }
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="contract.test.xmlpullparse" > <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
 

黎活明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. 抽象类(abstract class)与抽象方法

    package cm.aff.abst; /* abstract:抽象的,,可以修饰类,方法 1.修饰类: 抽象类: ①不能被实例化 ②有构造器的 ③凡是类都有构造器 ④抽象方法所修饰的类一定是抽象类 ...

  2. (数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画

    本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl相信很多人都听说过,作为 ...

  3. MySQL select from join on where group by having order by limit 执行顺序

    书写顺序:select [查询列表] from [表] [连接类型] join [表2] on [连接条件] where [筛选条件] group by [分组列表] having [分组后的筛选条件 ...

  4. Maven快速入门(三)Maven的坐标和仓库

    之前通过一个helloworld的例子来说一说如何创建maven项目以及maven项目的项目结构,然后讲maven如何编译运行项目.接下来介绍maven中几个比较重要的概念:坐标和仓库.Maven快速 ...

  5. PAT 1036 Boys vs Girls (25分) 比大小而已

    题目 This time you are asked to tell the difference between the lowest grade of all the male students ...

  6. Rocket - debug - TLDebugModuleInner - Abstract Data

    https://mp.weixin.qq.com/s/DOLkEi-_qQt6lWOhJ2hxVQ 简单介绍TLDebugModuleInner中抽象数据寄存器的实现. 1. abstractData ...

  7. java方法句柄-----3.方法句柄的实现接口

    目录 1.使用方法句柄实现接口 1.使用方法句柄实现接口   2.3节介绍的动态代理机制可以在运行时为多个接口动态创建实现类,并拦截通过接口进行的方法调用.方法句柄也具备动态实现一个接口的能力.这是通 ...

  8. Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离

    在数列 a_1, a_2, -, a_n中,定义两个元素 a_i 和 a_j 的距离为 |i-j|+|a_i-a_j|,即元素下标的距离加上元素值的差的绝对值,其中 |x| 表示 x 的绝对值. 给定 ...

  9. Java实现 蓝桥杯 算法提高 01背包

    算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...

  10. Java实现 LeetCode 131 分割回文串

    131. 分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa ...