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. ### MySQL主从搭建Position

    一.MySQL主从搭建 搭建主从架构的MySQL常用的有两种实现方式: 基于binlog的fileName + postion模式完成主从同步. 基于gtid完成主从同步搭建. 本篇就介绍如何使用第一 ...

  2. N3飞控踩坑指南

    1.想要使用上位机仿真的话,在本次连接上位机的过程中不要点击IMU校准. 2.两路12S电池并联为飞控供电时(DJI智能电池),需要确保所有电池均为满电.否则如果上电时电量不平衡,电池之间将会自动互相 ...

  3. Java实现 蓝桥杯 算法训练VIP 报数(暴力+数学)约瑟夫环问题

    试题 算法训练 报数 问题描述 现有n个同学站成一圈,顺时针编号1至n.从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止.问最后剩下的同学编号. 输入格 ...

  4. Java实现 LeetCode 744 寻找比目标字母大的最小字母(二分法)

    744. 寻找比目标字母大的最小字母 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 在比较时,数组里字母的是循环有序的.举个例 ...

  5. Java实现 蓝桥杯 算法提高 判断名次

    算法提高 判断名次 时间限制:1.0s 内存限制:256.0MB 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头---_-!)得了第1名的人23 ...

  6. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  7. Java实现 蓝桥杯VIP 算法训练 友好数

    有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 ...

  8. 第五届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的).他注意到:书的第10页和第11页在同一张纸上,但第 ...

  9. Java实现格子取数问题

    1 问题描述 有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走,一共走两次(即从左上角往右下角走两趟),把所有经过的格子里的数加起来,求总和的最大值.如果两次经过同一个 ...

  10. ant构建Jmeter脚本的build文件配置(build.xml)

    使用此构建文件可自动发送邮件  代码如下: <?xml version="1.0" encoding="UTF8"?> <project na ...