欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android平台基于Pull方式对XML文件解析与写入方法详解

程序员文章站 2024-03-03 21:35:28
本文详细讲述了android平台基于pull方式对xml文件解析与写入方法。分享给大家供大家参考,具体如下: xml技术在跨平台的情况下的数据交互中得到了广泛的应用,假如...

本文详细讲述了android平台基于pull方式对xml文件解析与写入方法。分享给大家供大家参考,具体如下:

xml技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个android应用程序,需要同服务器端进行数据交互,通过xml文件可以很方便的在android平台和服务器之间进行数据传输,具体实现涉及到对xml文件进行解析及写入的技术。本文实现在android平台上基于pull方式对xml文件解析的技术。

xmlpullparser是一个java实现的开源api包(源码下载地址http://www.xmlpull.org/),实现了pull方式解析xml文件的方法, android sdk中包含了该api,使用时需要导入以下三个包:

import org.xmlpull.v1.xmlpullparser;//包含解析xml文件类的包
import org.xmlpull.v1.xmlpullparserexception;//处理异常
importorg.xmlpull.v1.xmlserializer;//包含写入xml文件类的包

我们以sqlite数据库课堂练习中的数据类people为例,people类有4个属性:id,name,age,height,假设有一条测试数据id=1,name=”杜甫”,age=30,height=1.75,

在xml文件中对应的数据项元素如下:

<peopleinfo>
  <peopletag="item1">
    <id>1</id>
    <name>杜甫</name>
    <age>30</age>
    <height>1.75</height>
</people>
</peopleinfo>

1. 使用xmlpullparser对该文件解析

首先需要初始化一个xmlpullparser对象parser,r.xml.peopleinfo为文件peopleinfo.xml在项目中的标识,读入该文件后一步一步对文件中的元素进行解析。

xmlpullparser parser= getresources().getxml(r.xml.peopleinfo);

xmlpullparser的相关函数及说明如下:

相关函数或变量

说明

示例

xmlpullparser.start_document

文档开始标识,根元素

<peopleinfo>

xmlpullparser.end_document

文档结束标识

</peopleinfo>

xmlpullparser.start_tag

元素开始标识

<people>

xmlpullparser.end_tag

元素结束标识

</people>

geteventtype()

获取当元素的类型 (start_tag, end_tag, text, etc.)

如<peopleinfo>

的类型为start_document

next()

获取下一个待解析元素

事件表示<>括号中的一个项

getname()

获取当前元素的名字

如读取到<age>,返回值为”age”

nexttext()

返回当前元素所对应的文本值

如事件为<height>时,返回1.75

getattributename(int index)

获取当前元素中属性名

如tag

getattributevalue(int index)

获取当前元素中属性的值

"item1"


解析步骤:

1)    初始化parser,指定xml文件
2)    读取文档开始标识,根元素<peopleinfo>
3)    读取数据项元素开始标识, <people>
    a)    读取数据项元素的属性,tag="item1"
    b)    读取数据项的子元素,id,name,age,height
4)    一个数据项结束,</people>,保存该数据项的结果
5)    读取文档结束标识,</peopleinfo>

2. 使用xmlserializer对写xml文件

写入xml文件的过程:先初始化一个xmlserializer对象serializer,设置输出的writer对象,然后数据写入serializer中,再将该对象通过writer写入文件。

xmlserializer serializer = xml.newserializer();
serializer.setoutput(writer);
//…
writer.flush()

xmlserializer的相关函数及说明如下:

相关函数

说明

示例

setoutput(writer writer)

设置输出的writer对象

 

startdocument(string encoding, boolean standalone);

写入xml文件的起始标识语句,必须在setoutput后被调用

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

starttag(string namespace, string name);

写入开始元素标识

<people>,<age>

attribute(string namespace, string name, string value); 

 

tag=”people1”

text(string text)

写入元素值

如:杜甫

endtag(string namespace, string name)

写入元素结束标识

</people>,</age>

enddocument(); 

写入文档结束标记

 


写入步骤:

1) 初始化serializer
2) 设置writer对象writer
3) 写入文档开始标记<?xml version="1.0" encoding="utf-8"standalone="yes" ?>
4) 写入根元素<peopleinfo>
5) 写入数据项元素<people>
    a)  写入数据项属性tag=”people1”
    b)  写入数据项子元素,id,name,age,height
6) 写入数据项元素结束符</people>
7) 写入根元素结束符</peopleinfo>
8) 写入文档结束符
9) 通过writer将数据写入文件,writer.flush()
10) 关闭writer对象

实现工具类xmlpullhelper,提供对xml文件解析和写入的

1. 具体实现,代码如下:

package aaron.android.sqlitedamon;
import java.io.ioexception;
import java.io.writer;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import org.xmlpull.v1.xmlpullparser;
import org.xmlpull.v1.xmlpullparserexception;
import org.xmlpull.v1.xmlserializer;
import android.util.log;
public class xmlpullhelper {
  private xmlpullparser parser;
  private xmlserializer serializer;
  private arraylist<map<string, object>> contents=new arraylist<map<string,object>>();
  private map<string,object> map=null;
  public xmlpullhelper(xmlpullparser parser,xmlserializer serial){
    this.parser=parser;
    this.serializer = serial;
  }
  /**
   * 将xml文件中的所有节点的数据解析后保存在一个arraylist中返回
   * @param nodename:数据项的名称,这里为"people"
   * @param attr:数据项的属性,如id,name,age,height
   * @return 解析该xml文件数据的结果
   * @throws xmlpullparserexception
   * @throws ioexception
   */
  public arraylist<map<string,object>> xmlpull(string nodename,string[] attr) throws xmlpullparserexception, ioexception{
    //循环读取所有的元素
    while(parser.next()!=xmlpullparser.end_document){
      switch(parser.geteventtype()){
        case xmlpullparser.start_document:
          break;
        case xmlpullparser.start_tag:{  //元素开始标识
          //判断是否为所需要的数据项,如果是,在初始化一个map用于保存该数据项的值
          if(parser.getname()!=null&&parser.getname().equals(nodename)){
            map=new hashmap<string, object>();
            //循环读取该元素中所有的属性
            for(int j=0;j<parser.getattributecount();j++)
              map.put(parser.getattributename(j), parser.getattributevalue(j));//添加属性的值,如tag="item1"
          }
          else if(map!=null){
            for(int i=0;i<attr.length;i++){
              if(parser.getname()!=null&&parser.getname().equals(attr[i])){//添加子元素的值,如<name>张三</name>
                map.put(attr[i],parser.nexttext());
              }
            }
          }
          break;
        }
        case xmlpullparser.end_tag: {//元素结尾标识
          //判断是否为一个数据项的结束,如果是,将该数据项的数据添加到数据集contents中
          if(parser.getname().equals(nodename)&&map!=null){
            contents.add(map);
            map=null;
          }
          break;
        }
      }
    }
    return contents;
  }
  /**
   * 将给定的数据集写入xml文件
   * @param filename: 根元素名,默认设为跟文件名相同,如"peopleinfo"
   * @param nodename: 数据项名 如"people"
   * @param attr: 数据项的属性 如id,name,age,height
   * @param con: 待写入的数据集
   * @throws xmlpullparserexception
   * @throws ioexception
   */
  public void xmlwrite(string filename,string nodename,string[] attr,arraylist<map<string,object>> con) throws xmlpullparserexception, ioexception{
    serializer.startdocument("utf-8", true);
    serializer.starttag(null, filename);//开始根元素标签<peopleinfo>
    for(int i=0;i<con.size();i++)
    {
      //开始元素标签<people>
      serializer.starttag(null, nodename);
      //标签people属性
      serializer.attribute(null, "tag", "people"+i);
      //循环将子节点写入元素id,name,age,height
      for(int j=0;j<attr.length;j++)
      {
        serializer.starttag(null, attr[j]);
        serializer.text(con.get(i).get(attr[j]).tostring());
        serializer.endtag(null, attr[j]);
      }
      //结束标签</people>
      serializer.endtag(null, nodename);
    }
    //结束标签</peopleinfo>
    serializer.endtag(null, filename);
    //结束文档标记
    serializer.enddocument();
  }
}

1. 使用该工具类xmlpullhelper具体实现

//定义数据集对象contents用于保存从xml文件中读取的数据
arraylist<map<string, object>> contents = null;
//将数据写入xml文件,并保存到sd卡中
if(environment.getexternalstoragestate().equals(environment.media_mounted)){
    file sdcarddir = environment.getexternalstoragedirectory();//获取sdcard目录
    file savefile = new file(sdcarddir, "peopleinfo.xml");
    filewriter w=new filewriter(savefile);
    xmlserializer serializer = xml.newserializer();
    xmlpullhelper xhelper=new xmlpullhelper(null,serializer);
    //待写入的子元素标签
    string []items={"id","name","age","height"};
    //将writer对象传递给 serializer
    serializer.setoutput(w);
    xhelper.xmlwrite("peopleinfo", "people", items, contents);//调用写入方法
    w.flush(); //将serializer中数据写入文件
    w.close();
}
//读xml文件,解析并保存在数据集contents
xmlpullparser parser = getresources().getxml(r.xml.peopleinfo);
xmlpullhelper xhelper=new xmlpullhelper(parser,null);
string []items={"id","name","age","height"};
try{
  contents=xhelper.xmlpull("people", items);//调用解析方法
}
catch(exception e){
  log.e("xmlpullparser",e.getmessage(),e);
}

android sdk内置了pull解释器,使用xmlpullparser比较方便,解析xml文件的技术还有很多种,如 sax和dom,还需要更多的学习。

更多关于android相关内容感兴趣的读者可查看本站专题:《android操作xml数据技巧总结》、《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。