Android XML解析与保存程序代码

解析XML文件:

在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。

SAX解析器:

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

DOM解析器:

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。

PULL解析器:

在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;
pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理;通过paser.nextText()方法可以获取下一个Text类型的节点的值;

读取XML

 代码如下 复制代码
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");//为破解器添加要解析的XML数据
int event = pullParser.getEventType();//开始读取,获取事件返回值
pullParser.getName();//获取节点名称
pullParser.getAttributeValue(0);//获取第一个属性的值
pullParser.nextText();//获取标签之后的节点的内容
event = pullParser.next();

//解析器遇到结束标签不会自动向下解析,需要调用此方法进行继续执行;

保存文件到XML

 代码如下 复制代码

public static void save(List<Person> persons, OutputStream outStream)
throws Exception, IllegalStateException, IOException {
XmlSerializer serializer = Xml.newSerializer();//获取XML写入信息的序列化对象
serializer.setOutput(outStream, "UTF-8");//设置要写入的OutputStream
serializer.startDocument("UTF-8", true);//设置文档标签

serializer.startTag(null, "persons");//设置开始标签,第一个参数为namespace
for (Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());

serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");

serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");

serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
outStream.flush();
outStream.close();
}

解析xml

 代码如下 复制代码

<?xml version="1.0" encoding="utf-8"?>
<books>
 <book>
  <id>1001</id>
  <name>Thinking In Java</name>
  <price>80.00</price>
 </book>
 <book>
  <id>1002</id>
  <name>Core Java</name>
  <price>90.00</price>
 </book>
 <book>
  <id>1003</id>
  <name>Hello, Andriod</name>
  <price>100.00</price>
 </book>
</books>

然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:

 代码如下 复制代码

package com.scott.xml.model;

public class Book {
 private int id;
 private String name;
 private float price;
 
 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public float getPrice() {
  return price;
 }

 public void setPrice(float price) {
  this.price = price;
 }

 @Override
 public String toString() {
  return "id:" + id + ", name:" + name + ", price:" + price;
 }
}

最后,我们还要把这个集合对象中的数据生成一个新的XML文档,生成的XML结构跟原始文档略有不同,是下面这种格式:

 代码如下 复制代码

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1001">
    <name>Thinking In Java</name>
    <price>80.0</price>
  </book>
  <book id="1002">
    <name>Core Java</name>
    <price>90.0</price>
  </book>
  <book id="1003">
    <name>Hello, Andriod</name>
    <price>100.0</price>
  </book>
</books>

接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。BookParser.java代码如下:

 代码如下 复制代码

package com.scott.xml.parser;

import java.io.InputStream;
import java.util.List;

import com.scott.xml.model.Book;

public interface BookParser {
 /**
  * 解析输入流 得到Book对象集合
  * @param is
  * @return
  * @throws Exception
  */
 public List<Book> parse(InputStream is) throws Exception;
 
 /**
  * 序列化Book对象集合 得到XML形式的字符串
  * @param books
  * @return
  * @throws Exception
  */
 public String serialize(List<Book> books) throws Exception;
}

时间: 2024-10-03 16:30:21

Android XML解析与保存程序代码的相关文章

基于Android XML解析与保存的实现_Android

解析XML文件:在Android平台上可以使用SAX.DOM和Android附带的pull解析器解析XML文件:pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理:通过paser.nextText()方法可以获取下一个Text类型的节点的值:http://xmlpull.org/xmlpull-website/impls.shtml; 读取XMLXmlPullParser p

基于Android XML解析与保存的实现

解析XML文件:在Android平台上可以使用SAX.DOM和Android附带的pull解析器解析XML文件:pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理:通过paser.nextText()方法可以获取下一个Text类型的节点的值:http://xmlpull.org/xmlpull-website/impls.shtml; 读取XMLXmlPullParser p

Android编程实现XML解析与保存的三种方法详解

本文实例讲述了Android编程实现XML解析与保存的三种方法.分享给大家供大家参考,具体如下: 简介 在Android开发中,关于XML解析有三种方式,分别是: 1. SAX 基于事件的解析器,解析速度快,占用内存少.非常适合在Android移动设备中使用. 2. DOM 在内存中以树形结构存放,因此检索和更新效率会更高.但是对于特别大的文档,解析和加载整个文档将会很耗资源 3. PULL 基于事件的解析器,不同于SAX是,PULL是主动请求下一个事件,所以在可控上PULL要比SAX实用.An

android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三: 把复杂对象转换成 xml android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象   1.建立JavaBeen package com.android10; public clas

android XMl 解析神奇xstream 二: 把对象转换成xml

前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件   1.Javabeen 代码 package com.android10; public class Product { private String name ; private String age ; public String getName() { return name; } public void setName(Str

android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xstream 二: 把对象转换成xml android XMl 解析神奇xstream 三: 把复杂对象转换成 xml   1.文件准备 把一个预先写好的xml文件放在android项目目录的 asset 文件夹. 文件内容为: <blog> <age>30</age> &l

Android xml解析实例详解

Android  xml解析实例详解 实现效果图: XmlActivity package com.Android.xiong.gridlayoutTest; import android.app.Activity; import android.content.res.XmlResourceParser; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; impo

android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

  简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件.   1.下载工具 xstream   下载最新版本地址: https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/   下载完成后 把jar包导入到自己的android项目中    2. 常用的方法: (1)f

Android xml文件的序列化实现代码_Android

传统方式: 复制代码 代码如下: public void backSms(View view){  //假设我已经获取到了所有的短信  StringBuilder sb = new StringBuilder();  sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");  sb.append("<smss>");  for(SmsInfo in