博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android关于pull解析的问题-1
阅读量:5892 次
发布时间:2019-06-19

本文共 6325 字,大约阅读时间需要 21 分钟。

 

android关于pull解析步骤如下:

 

一、介绍:

       此文主要是介绍利用pull解析器读取手机上的xml文件和把对象保存到xml文件中

二、新建一个android工程——PullXml

      工程目录:

     

 

三、清单列表AndroidManifest.xml的配置为:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns: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文档结束

转载于:https://www.cnblogs.com/lz-cswb/archive/2012/05/24/2516850.html

你可能感兴趣的文章
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
影响企业信息化成败的几点因素
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
struts中的xwork源码下载地址
查看>>
ABP理论学习之仓储
查看>>
我的友情链接
查看>>
CentOS图形界面和命令行切换
查看>>
HTML5通信机制与html5地理信息定位(gps)
查看>>
加快ALTER TABLE 操作速度
查看>>