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

本文详细讲述了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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 解析
, xml文件
, 写入
Pull方式
xmlpullparser解析xml、android pull解析xml、pull解析xml、android xmlpull解析、java pull解析xml,以便于您获取更多的相关知识。

时间: 2024-08-08 04:18:34

Android平台基于Pull方式对XML文件解析与写入方法详解_Android的相关文章

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

本文详细讲述了Android平台基于Pull方式对XML文件解析与写入方法.分享给大家供大家参考,具体如下: XML技术在跨平台的情况下的数据交互中得到了广泛的应用,假如我们需要开发一个Android应用程序,需要同服务器端进行数据交互,通过XML文件可以很方便的在Android平台和服务器之间进行数据传输,具体实现涉及到对XML文件进行解析及写入的技术.本文实现在Android平台上基于Pull方式对XML文件解析的技术. XmlPullParser是一个Java实现的开源API包(源码下载地

Android中gson、jsonobject解析JSON的方法详解_Android

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

Android应用中图片浏览时实现自动切换功能的方法详解_Android

先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com.chenzheng_java; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.V

Android OnCreate()中获取控件高度与宽度两种方法详解_Android

Android OnCreate()中获取控件高度与宽度 试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.Me

解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解_Android

Android获取系统cpu信息,内存,版本,电量等信息 1.CPU频率,CPU信息:/proc/cpuinfo和/proc/stat 通过读取文件/proc/cpuinfo系统CPU的类型等多种信息.读取/proc/stat 所有CPU活动的信息来计算CPU使用率 下面我们就来讲讲如何通过代码来获取CPU频率: 复制代码 代码如下: package com.orange.cpu; import java.io.BufferedReader;import java.io.FileNotFound

android编程之xml文件读取和写入方法_Android

本文实例讲述了android编程之xml文件读取和写入方法.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Eclipse 二.说明: 1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置 2.读取xml文件 三.xml文件格式: <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<config> <titl

android编程之xml文件读取和写入方法

本文实例讲述了android编程之xml文件读取和写入方法.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Eclipse 二.说明: 1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置 2.读取xml文件 三.xml文件格式: <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<config> <titl

Java Spring MVC 上传下载文件配置及controller方法详解_java

下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

Android中gson、jsonobject解析JSON的方法详解

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke