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

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

概述本文详细讲述了Android平台基于Pull方式对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文件中对应的数据项元素如下:

@H_502_15@<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的相关函数及说明如下:

@H_173_419@

说明

@H_173_419@

设置输出的Writer对象

@H_173_419@

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

@H_173_419@

写入开始元素标识

@H_173_419@

 

@H_173_419@

写入元素值

@H_173_419@

写入元素结束标识

@H_173_419@

写入文档结束标记

相关函数

示例

setOutput(Writer writer)

 

startdocument(String enCoding, Boolean standalone);

<?xml version="1.0" enCoding="UTF-8" standalone="yes" ?>

startTag(String namespace,0); text-decoration: none" href="http://developer.androID.com/reference/java/lang/String.HTML">String name);

<people>,<age>

attribute(String name,0); text-decoration: none" href="http://developer.androID.com/reference/java/lang/String.HTML">String value); 

tag=”people1”

text(String text)

如:杜甫

endTag(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,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,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文件,解析并保存在数据集contentsXmlPullParser parser = getResources().getXml(R.xml.peopleinfo);XmlPullHelper xHelper=new XmlPullHelper(parser,null);String []items={"ID","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程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android平台基于Pull方式对XML文件解析与写入方法详解全部内容,希望文章能够帮你解决Android平台基于Pull方式对XML文件解析与写入方法详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1147962.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存