黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容
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内容的更多相关文章
- 黎活明8天快速掌握android视频教程--20_采用ContentProvider对外共享数据
1.内容提供者是让当前的app的数据可以让其他应用访问,其他应该可以通过内容提供者访问当前app的数据库 contentProvider的主要目的是提供一个开发的接口,让其他的应该能够访问当前应用的数 ...
- 黎活明8天快速掌握android视频教程--19_采用ListView实现数据列表显示
1.首先整个程序也是采用mvc的框架 DbOpenHelper 类 package dB; import android.content.Context; import android.databas ...
- 黎活明8天快速掌握android视频教程--16_采用SharedPreferences保存用户偏好设置参数
SharedPreferences保存的数据是xml格式,也是存在数据保存的下面四种权限: 我们来看看 我们来看看具体的业务操作类: /** * 文件名:SharedPrecences.java * ...
- 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...
- 黎活明8天快速掌握android视频教程--25_网络通信之资讯客户端
1 该项目的主要功能是:后台通过xml或者json格式返回后台的视频资讯,然后Android客户端界面显示出来 首先后台新建立一个java web后台 采用mvc的框架 所以的servlet都放在se ...
- 黎活明8天快速掌握android视频教程--24_网络通信之网页源码查看器
1 该项目的主要功能就是从将后台的html网页在Android的界面上显示出来 后台就是建立一个java web工程在工程尚建立一个html或者jsp文件就可以了,这里主要看Android客户端的程序 ...
- 黎活明8天快速掌握android视频教程--23_网络通信之网络图片查看器
1.首先新建立一个java web项目的工程.使用的是myeclipe开发软件 图片的下载路径是http://192.168.1.103:8080/lihuoming_23/3.png 当前手机和电脑 ...
- 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化
采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...
- 黎活明8天快速掌握android视频教程--17_创建数据库与完成数据添删改查
1.我们首先来看下整个项目 项目也是采用mvc的框架 package dB; import android.content.Context; import android.database.sqlit ...
随机推荐
- 几种常见的app推广形式
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- JVM系列.JDK演进历史
Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...
- 【LINQ标准查询操作符总结】之聚合操符
C# 中的LINQ 提供了两种操作方式,查询表达式和查询操作符,所有的查询表达式都有对应的查操作符类替代,查询表达式有点“类” SQL,在代码中写SQL,总觉得不够“优雅”,使用查询操作符就显得“优 ...
- php mysqli使用
连接到数据库$mysqli = new mysqli(主机,用户,密码,数据库); 选择数据库$mysqli->select_db(数据库);设置编码$mysqli->set_charse ...
- ActiveMQ 反序列化漏洞(CVE-2015-5254)复现
1.运行漏洞环境 sudo docker-compose up -d 环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递:8161是Web管理页面端口.访 ...
- golang内置类型和内置函数
golang内置类型和内置函数是不需要引入包直接可用的 golang内置类型: 数值类型 string int,unint float32,float64 bool array 有长度的 comple ...
- MySQL国内镜像下载地址
最近重新下载MySQL发现官网下载速度不是一般的慢,官网下载要几个钟而且一不注意就被取消下载了,实在受不了 可以使用sohu的镜像:http://mirrors.sohu.com/mysql/MySQ ...
- 第十届蓝桥杯JavaC组省赛真题
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- Java实现 LeetCode 617 合并二叉树(遍历树)
617. 合并二叉树 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点 ...