android中xml解析之xmlpull篇

来源:互联网 发布:mac暴风影音删除不了 编辑:程序博客网 时间:2024/05/18 02:36

Xml作为编程中一种重要的数据处理格式,用于标记数据、定义数据类型,是一种允许用户自己定义标记的源语言。Xml作为一种轻量级的数据文件,具有以下优点:

内容与结构完全分离

互操作性强

规范统一

支持多种编码

可扩展性强

常用于以下场合:

数据交换

Web服务

内容管理

配置

下面我将针对android中xml的处理做一些介绍,以此作为笔记以便后期查看与阅读。在编程中比较常用的xml解析方式有XmlPull、Sax、Dom等

1 利用XMLPull进行xml数据解析

XmlPull数据解析是以事件的方式进行文档解析的,如开始元素事件与结束元素事件,使用parser.next()进入下一个元素并触发相应的事件。事件将作为代码被发送,可以通过switch对需要的事件进行处理。

在此我提供一个xml文档,内容如下:

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

<Configurations>

       <Persons>

              <Personid="1" name="tom" sex="female"description="" address="sichuan" />

              <Personid="2" name="jim" sex="male"description="" address="beijing" />

       </Persons>

       <Works>

              <Workid="1" name="software" description="">

                     <Personrefid="1" />

                     <Content>Progromingjava application</Content>

              </Work>

              <Workid="2" name="hardware" description="">

                     <Personrefid="2" />

                     <Content>Progromingiphone application</Content>

              </Work>

       </Works>

</Configurations>

后面所讲述的DOM与SAX处理都将对上面的xml文档进行处理,下面我们开始针对上面的文档利用XmlPull进行解析与生成的处理吧!

1.1 首先需要定义两个实体,实体如下:

1.1.1 Person.java

public class Person {

       privateint id;

       privateString name;

       privateString sex;

       privateString description;

       privateString address;

       publicint getId() {

              returnid;

       }

       publicvoid setId(int id) {

              this.id= id;

       }

       publicString getName() {

              returnname;

       }

       publicvoid setName(String name) {

              this.name= name;

       }

       publicString getSex() {

              returnsex;

       }

       publicvoid setSex(String sex) {

              this.sex= sex;

       }

       publicString getDescription() {

              returndescription;

       }

       publicvoid setDescription(String description) {

              this.description= description;

       }

       publicString getAddress() {

              returnaddress;

       }

       publicvoid setAddress(String address) {

              this.address= address;

       }

}

1.1.2 Work.java

package com.example.Entities;

 

public class Work {

       privateint id;

       privateString name;

       privateString description;

       privateint refid;

       privateString content;

       publicint getId() {

              returnid;

       }

       publicvoid setId(int id) {

              this.id= id;

       }

       publicString getName() {

              returnname;

       }

       publicvoid setName(String name) {

              this.name= name;

       }

       publicString getDescription() {

              returndescription;

       }

       publicvoid setDescription(String description) {

              this.description= description;

       }

       publicint getRefid() {

              return refid;

       }

       publicvoid setRefid(int refid) {

              this.refid= refid;

       }

       publicString getContent() {

              returncontent;

       }

       publicvoid setContent(String content) {

              this.content= content;

       }

      

}

1.1.3 以下该类用于解析Persons节点下的内容

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

 

import org.xmlpull.v1.XmlPullParser;

importorg.xmlpull.v1.XmlPullParserException;

 

import android.util.Xml;

 

import com.example.Entities.Person;

 

public class PersonXmlService {

       publicPersonXmlService() {

 

       }

 

       publicstatic List<Person> getAllPersons(InputStream inputStream) {

              List<Person>persons = new ArrayList<Person>();

              XmlPullParserparser = Xml.newPullParser();

              try{

                     parser.setInput(inputStream,"utf-8");

                     inteventCode = parser.getEventType();

                     Personperson = null;

                     while(eventCode != XmlPullParser.END_DOCUMENT) {

                            StringTAG = parser.getName();

                            switch (eventCode) {

                            caseXmlPullParser.START_DOCUMENT:

 

                                   break;

                            caseXmlPullParser.START_TAG:

                                   if("Person".equalsIgnoreCase(TAG)) {

                                          person= new Person();

                                          person.setId(Integer.parseInt(parser.getAttributeValue(

                                                        null,"id")));

                                          person.setName(parser.getAttributeValue(null,"name"));

                                          person.setSex(parser.getAttributeValue(null,"sex"));

                                          person.setDescription(parser.getAttributeValue(null,"description"));

                                          person.setAddress(parser.getAttributeValue(null,"address"));

                                   }

 

                                   break;

                            caseXmlPullParser.END_TAG:

                                   if("Person".equalsIgnoreCase(TAG)) {

                                          persons.add(person);

                                   }

                                   if("Persons".equalsIgnoreCase(TAG)) {

                                          break;

                                   }

                                   break;

                            caseXmlPullParser.END_DOCUMENT:

 

                                   break;

 

                            default:

                                   break;

                            }

                     }

              }catch (XmlPullParserException e) {

                     e.printStackTrace();

              }

              returnpersons;

       }

}

方法中传入的InputStream属于将xml转换的输入流。Works节点下的内容解析就不做代码提供了,各位可以根据以上的实例自己编写以下Works节点下的内容解析。

1.1.4 以下代码用于生成Persons节点内容

public static voidConvertToXml(List<Person> persons) {

              XmlSerializerserializer = Xml.newSerializer();

              StringWriterwriter = new StringWriter();

              try{

                     serializer.setOutput(writer);

                     serializer.startDocument("utf-8",false);

                     serializer.startTag(null,"Configurations");

                     serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",false);

                     serializer.startTag(null,"Persons");

                     for(int i = 0; i < persons.size(); i++) {

                            serializer.startTag(null,"Person");

                            serializer.attribute(null,"id", String.valueOf(persons.get(i).getId()));

                            serializer.attribute(null,"name", persons.get(i).getName());

                            serializer.attribute(null,"sex", persons.get(i).getSex());

                            serializer.attribute(null,"description", persons.get(i).getDescription());

                            serializer.attribute(null,"address", persons.get(i).getAddress());

                            serializer.endTag(null,"Person");

                     }

                     serializer.endTag(null,"Persons");

                     serializer.endDocument();

              }catch (IllegalArgumentException e) {

                     e.printStackTrace();

              }catch (IllegalStateException e) {

                     e.printStackTrace();

              }catch (IOException e) {

                     e.printStackTrace();

              }

       }

借此机会将这些整理一下,供作参考,各位大牛们如有建议,希望多多赐教!不甚感激。

原创粉丝点击