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

由于刚接触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节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值