由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦:
步骤如下:
一、介绍:
此文主要是介绍利用pull解析器读取手机上的xml文件和把对象保存到xml文件中
二、新建一个android工程——PullXml
工程目录:
三、清单列表AndroidManifest.xml的配置为:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.pull"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<!--单元测试 加这句-->
<uses-library android:name="android.test.runner" />
<activity
android:name=".PullXml6Activity"
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>
<!--单元测试加这句,其中android:targetPackage为当前应用的包名
android:targetPackage 目标包是指单元测试的类的上面包和manifest的
package="com.example.pull" 保持一致
这样就决定了你建立测试类的时候也必须在这个包下面
-->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.pull"
android:label="Test for my app"/>"
</manifest>
四、Person .java实体类源码:
package com.example.domain;
public class Person {
private Integer id;
private String name;
private Integer 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;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
}
五、PersonService .java业务类源码
package com.example.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.example.domain.Person;
public class PersonService {
//由于没有使用类的成员变量所以可以把此方法声明为static方法
public static List<Person> getPersons(InputStream xml) throws Exception{
//XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
XmlPullParser pullParser = Xml.newPullParser();//得到XmlPullParser实例
pullParser.setInput(xml,"UTF-8");//把xml放入pull解析器中
int event = pullParser.getEventType();//得到触发的事件类型,为整形,跟踪返回的数字来选择要处理内容
//xml节点(node)分 element节点和text节点,<elment节点>text节点</emenet节点>
ArrayList<Person> persons=null;
Person person = null;
while(event != XmlPullParser.END_DOCUMENT){//判断是否读取文档结尾,为结尾跳出循环
//0:文档开始 1:XmlPullParser.END_DOCUMENT 2:节点
switch(event){//选择事件
case XmlPullParser.START_DOCUMENT://文档开始
persons = new ArrayList<Person>();//创建一个数组
break;
case XmlPullParser.START_TAG://节点开始标志
if("person".equals(pullParser.getName())){//当节点在person时
int id = Integer.parseInt(pullParser.getAttributeValue(0));//得到第一个节点的Id值
person = new Person();
person.setId(id);
}
if("name".equals(pullParser.getName())){//当节点指到name时
String name = pullParser.nextText();//取得name节点后面的text节点的值
if(person!=null){
person.setName(name);
}
}
if("age".equals(pullParser.getName())){//当节点指到age时
int age = Integer.parseInt(pullParser.nextText());//取得age节点后面的text节点的值
if(person!=null){
person.setAge(age);
}
}
break;
case XmlPullParser.END_TAG://节点结束标志
if("person".equals(pullParser.getName())){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
/**
* 保存数据导xml文件中
* @param persons 数据
* @param out 输出方向
* @throws Exception
*/
public static void save(List<Person> persons,OutputStream out) throws Exception{
//要用Pull解释器保存数据导XML中,要先得到一个xml序列化器
XmlSerializer serializer = Xml.newSerializer();
//设置内容的输出方向以及字符编码
serializer.setOutput(out,"UTF-8");
//设置文档开始,第二个参数:是否可以单独存在(true时:standalone='yes';false时:standalone='no')
serializer.startDocument("UTF-8", true);
//设置persons节点开始
serializer.startTag(null, "persons");
//循环迭代创建person节点以及name和age节点
for(Person person:persons){
//startTag参数:第一个是命名空间,第二个是开始节点名称
serializer.startTag(null, "person");
//attribute参数:第一个是命名空间,第二个是节点属性名称,第三个是节点属性值
serializer.attribute(null, "id", person.getId().toString());
serializer.startTag(null, "name");
//text参数:text节点的值
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
//endTag参数:第一个是命名空间,第二个是结束节点名称
serializer.endTag(null, "person");
}
//设置persons节点结束
serializer.endTag(null, "persons");
//设置文档结束
serializer.endDocument();
out.flush();//
out.close();
}
}
六、PersonServiceTest .java测试类源码:
package com.example.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.example.domain.Person;
import com.example.service.PersonService;
import android.test.AndroidTestCase;
import android.util.Log;
public class PersonServiceTest extends AndroidTestCase {
public void testGetPersons() throws Exception{
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PersonService.getPersons(xml);
for(Person person:persons){
Log.i("PersonService", person.toString());
}
}
public void testSave() throws Exception{
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(43,"zhangxx",20));
persons.add(new Person(53,"lili",21));
persons.add(new Person(423,"xiaoxiao",18));
persons.add(new Person(412,"mimi",17));
//包/files
File xmlFile = new File(getContext().getFilesDir(),"test.xml");
FileOutputStream fos = new FileOutputStream(xmlFile);
PersonService.save(persons, fos);
}
}
七、person.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="22">
<name>dada</name>
<age>21</age>
</person>
<person id="100">
<name>mm</name>
<age>28</age>
</person>
</persons>
八、注意事项以及相关知识点:
1、pull解析器工作原理同sax
2、pull解析xml文档特点:
从上到下顺序的读取,一个节点挨着一个节点的读取
xml节点分element节点和text节点
xml文档有开始和结束标志,节点也有开始和结束标志,如下标志:
<?xml version="1.0" encoding="UTF-8"?>//xml文档开始
<persons>//根节点开始
<person id="22">
<name>dada</name>
<age>21</age>
</person>
<person id="100">
<name>mm</name>
<age>28</age>
</person>
</persons>//根节点结束
//xml文档结束
如上颜色快所示:绿色为elmenet节点开始 、蓝色为element节点结束、红色为text节点