android操作XML的几种方式(转)

XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现。其标准型,可靠性,安全性......毋庸置疑。在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件。

小提示:android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等。

在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等。其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的。

1)

在java平台中,有诸如DOM4J这样优秀的开源包,极大程度的方便大家使用DOM标准来操作XML文件。在javascript中,不同的浏览器解析引擎,对DOM的解析和操作也略有差异(不过这不是本章介绍的重点)。而DOM的方式,也有其缺点。通常一次性加载xml文件,再使用DOM的 api去进行解析,这样很大程度的消耗内存,对性能会有一定影响。而我们的android手机,虽然配置在不断的升级,但是内存方面,暂时还无法与传统的PC去媲美。所以,在android上面,不太推荐使用DOM的方式来解析和操作XML。

[csharp] view plaincopy

  1. package cn.itcast.service;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;
  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.Node;
  10. import org.w3c.dom.NodeList;
  11. import cn.itcast.model.Person;
  12. public class DomPersonService {
  13. public List<Person> getPersons(InputStream stream) throws Throwable
  14. {
  15. List<Person> list =new ArrayList<Person>();
  16. DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
  17. DocumentBuilder builder =factory.newDocumentBuilder();
  18. Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能
  19. //开始使用dom的api去解析
  20. Element root = dom.getDocumentElement();//根元素
  21. NodeList personNodes = root.getElementsByTagName("person");//返回所有的person元素节点
  22. //开始遍历啦
  23. for(int i=0;i<personNodes.getLength();i++)
  24. {
  25. Person person =new Person();
  26. Element personElement =(Element)personNodes.item(i);
  27. person.setId(new Integer( personElement.getAttribute("id")));//将person元素节点的属性节点id的值,赋给person对象
  28. NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点
  29. //遍历所有子节点
  30. for(int j=0;j<personChildrenNodes.getLength();j++)
  31. {
  32. //判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理)
  33. if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE)
  34. {
  35. //子节点--元素节点
  36. Element childNode =(Element)personChildrenNodes.item(j);
  37. if("name".equals(childNode.getNodeName()))
  38. {
  39. //如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象
  40. person.setName(childNode.getFirstChild().getNodeValue());
  41. }else if("age".equals(childNode.getNodeValue()))
  42. {
  43. person.setAge(new Integer(childNode.getFirstChild().getNodeValue()));
  44. }
  45. }
  46. }
  47. list.add(person);
  48. }
  49. return list;
  50. }
  51. }

2)

SAX(Simple API for XML),是一个使用非常广泛的XML解析标准,通常使用Handler模式来处理XML文档,这种处理模式和我们平常习惯的理解方式很不同,身边也经常有一些朋友在刚接触SAX的时候会觉得理解起来有些困难。其实SAX并不复杂,只不过是换了一种思维方式,正如它的名字所表示的,为了让我们以更简单的方式来处理XML文档,下面我们就开始吧。

[java] view plaincopy

  1. package cn.itcast.service;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.parsers.SAXParser;
  6. import javax.xml.parsers.SAXParserFactory;
  7. import org.xml.sax.Attributes;
  8. import org.xml.sax.SAXException;
  9. import org.xml.sax.helpers.DefaultHandler;
  10. import cn.itcast.model.Person;
  11. public class SAXPersonService {
  12. public List<Person> getPersons(InputStream inStream) throws Throwable
  13. {
  14. SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式?
  15. SAXParser parser =factory.newSAXParser();
  16. PersonParse personParser =new PersonParse();
  17. parser.parse(inStream, personParser);
  18. inStream.close();
  19. return personParser.getPerson();
  20. }
  21. private final class PersonParse extends DefaultHandler
  22. {
  23. private List<Person> list = null;
  24. Person person =null;
  25. private String tag=null;
  26. public List<Person> getPerson() {
  27. return list;
  28. }
  29. @Override
  30. public void startDocument() throws SAXException {
  31. list =new ArrayList<Person>();
  32. }
  33. @Override
  34. public void startElement(String uri, String localName, String qName,
  35. Attributes attributes) throws SAXException {
  36. if("person".equals(localName))
  37. {
  38. //xml元素节点开始时触发,是“person”
  39. person = new Person();
  40. person.setId(new Integer(attributes.getValue(0)));
  41. }
  42. tag =localName;//保存元素节点名称
  43. }
  44. @Override
  45. public void endElement(String uri, String localName, String qName)
  46. throws SAXException {
  47. //元素节点结束时触发,是“person”
  48. if("person".equals(localName))
  49. {
  50. list.add(person);
  51. person=null;
  52. }
  53. tag =null;//结束时,需要清空tag
  54. }
  55. @Override
  56. public void characters(char[] ch, int start, int length)
  57. throws SAXException {
  58. if(tag!=null)
  59. {
  60. String data = new String(ch,start,length);
  61. if("name".equals(tag))
  62. {
  63. person.setName(data);
  64. }else if("age".equals(tag))
  65. {
  66. person.setAge(new Integer(data));
  67. }
  68. }
  69. }
  70. }
  71. }

3)

Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。

[java] view plaincopy

  1. package cn.itcast.service;
  2. import java.io.InputStream;
  3. import java.io.Writer;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import org.xmlpull.v1.XmlPullParser;
  7. import org.xmlpull.v1.XmlSerializer;
  8. import android.util.Xml;
  9. import cn.itcast.model.Person;
  10. public class PullPersonService {
  11. //保存xml文件
  12. public static void saveXML(List<Person> list,Writer write)throws Throwable
  13. {
  14. XmlSerializer serializer =Xml.newSerializer();//序列化
  15. serializer.setOutput(write);//输出流
  16. serializer.startDocument("UTF-8", true);//开始文档
  17. serializer.startTag(null, "persons");
  18. //循环去添加person
  19. for (Person person : list) {
  20. serializer.startTag(null, "person");
  21. serializer.attribute(null, "id", person.getId().toString());//设置id属性及属性值
  22. serializer.startTag(null, "name");
  23. serializer.text(person.getName());//文本节点的文本值--name
  24. serializer.endTag(null, "name");
  25. serializer.startTag(null, "age");
  26. serializer.text(person.getAge().toString());//文本节点的文本值--age
  27. serializer.endTag(null, "age");
  28. serializer.endTag(null, "person");
  29. }
  30. serializer.endTag(null, "persons");
  31. serializer.endDocument();
  32. write.flush();
  33. write.close();
  34. }
  35. public List<Person> getPersons(InputStream stream) throws Throwable
  36. {
  37. List<Person> list =null;
  38. Person person =null;
  39. XmlPullParser parser =Xml.newPullParser();
  40. parser.setInput(stream,"UTF-8");
  41. int type =parser.getEventType();//产生第一个事件
  42. //只要当前事件类型不是”结束文档“,就去循环
  43. while(type!=XmlPullParser.END_DOCUMENT)
  44. {
  45. switch (type) {
  46. case XmlPullParser.START_DOCUMENT:
  47. list =  new ArrayList<Person>();
  48. break;
  49. case XmlPullParser.START_TAG:
  50. String name=parser.getName();//获取解析器当前指向的元素名称
  51. if("person".equals(name))
  52. {
  53. person =new Person();
  54. person.setId(new Integer(parser.getAttributeValue(0)));
  55. }
  56. if(person!=null)
  57. {
  58. if("name".equals(name))
  59. {
  60. person.setName(parser.nextText());//获取解析器当前指向的元素的下一个文本节点的文本值
  61. }
  62. if("age".equals(name))
  63. {
  64. person.setAge(new Integer(parser.nextText()));
  65. }
  66. }
  67. break;
  68. case XmlPullParser.END_TAG:
  69. if("person".equals(parser.getName()))
  70. {
  71. list.add(person);
  72. person=null;
  73. }
  74. break;
  75. }
  76. type=parser.next();//这句千万别忘了哦
  77. }
  78. return list;
  79. }
  80. }

下面是Model层的Person类的代码:

[java] view plaincopy

    1. package cn.itcast.model;
    2. public class Person {
    3. private Integer id;
    4. public Integer getId() {
    5. return id;
    6. }
    7. public void setId(Integer id) {
    8. this.id = id;
    9. }
    10. private String name;
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. private Integer age;
    18. public Integer getAge() {
    19. return age;
    20. }
    21. public void setAge(Integer age) {
    22. this.age = age;
    23. }
    24. public Person()
    25. {
    26. }
    27. public Person(Integer id, String name, Integer age) {
    28. this.id = id;
    29. this.name = name;
    30. this.age = age;
    31. }
    32. @Override
    33. public String toString() {
    34. return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    35. }
    36. }

转载自:http://blog.csdn.net/dinglang_2009/article/details/6940225

时间: 2024-10-29 21:13:28

android操作XML的几种方式(转)的相关文章

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

Android处理XML的三种方式

http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html http://blog.csdn.net/zzp16/article/details/7795410 http://www.ibm.com/developerworks/cn/xml/x-android/ http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html http://mobile.

C#操作xml的3种方式

C#操作Xml有很多种方式,这里写出个人常使用的三种方式 XmlDocument DataSet linq to xml 首先声明本次操作使用的xml文件:books.xml:内容如下 <?xml version="1.0" encoding="UTF-8"?> <books> <book display="书本记录"> <name>哈里波特</name> <price>10

Android开发之使用sqlite3工具操作数据库的两种方式

使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/fengyuzhengfan/article/details/40193123 在Android SDK的tools目录下提供了一"sqlite3.exe工具,它是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口在有些时候,开发者利用该工具来査询. 管理数据库. 下面介绍两种方式: 第

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

通过编码和xml文件两种方式实现tween动画

tween有四种动画效果:alpha(透明).rotate(旋转), translate(移动),scale(缩放); 可以通过硬编码和xml文件这两种方式来实现. xml实现: 第一步:在项目的res文件下面新建一个文件夹名字是anim(必须) 第二步:在anim文件夹下面新建新的xml文件,在xml文件中具体设置动画效果 第三步:在Activity中使用 AnimationUtils.loadAnimation(MainActivity.this,R.anim.xx);来获取. 1.alph

简介C#读取XML的两种方式

简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询 XML作用 对于XML,想必各位都比较了解,我也就不用费笔墨来描述它是什么了,我想在未来的Web开发中XML一定会大放异彩,XML是可扩展标记语言,使用它企 业可以制定一套自己的数据格式.用于Internet的数据

解析XML的4种方式及优缺点比较

dom, sax是解析xml的底层接口 而jdom和dom4j则是基于底层api的更高级封装    dom是通用的,而jdom和dom4j则是面向java语言的 (方法一). DOM解析说明:为 XML 文档的已解析版本定义了一组接口.解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构.优点:整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能:缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间:使用场合:一旦解析了文档还需多次

Android——数据存储(四种方式之二)读写SD卡

Android--数据存储(四种方式) 1.SharedPrefereces 只能保存一些简单的数轻量级.XML  存储文件名, 数据保存在data/data/basepackage/shared_prefs/myopt.xml中    实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default) 2.读写SD卡  SD的根目录  适用于数据流读写 实现步骤:加入读写SD卡权限