您的位置:首页 > 移动开发 > Android开发

android的Pull 解析xml文档(看完就知道如此简单)

2014-06-17 14:53 267 查看
由于刚接触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节点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: