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。

  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文档,下面我们就开始吧。

  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可以在程序中控制想解析到哪里就可以停止解析。

  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类的代码:

    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

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

  1. C#操作xml的3种方式

    C#操作Xml有很多种方式,这里写出个人常使用的三种方式 XmlDocument DataSet linq to xml  首先声明本次操作使用的xml文件:books.xml:内容如下 <?x ...

  2. Android处理XML的三种方式

    http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html http://blog.csdn.net/zzp16/articl ...

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

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

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

    简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的 ...

  5. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  6. android 数据存储的几种方式

    总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数 ...

  7. java解析xml的几种方式

    java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...

  8. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  9. Hadoop之HDFS文件操作常有两种方式(转载)

    摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

随机推荐

  1. Linux下安装php screw

    1.下载地址:http://sourceforge.net/projects/php-screw/ 2. tar zxvf php_screw_1.5.tar.gz cd php_screw_1.5 ...

  2. linux下的struct sigaction

    工作中使用案例: struct sigaction act; act.sa_sigaction = handleSignal; act.sa_flags = SA_SIGINFO; sigemptys ...

  3. javascript和HTML5上传图片之前实现预览效果

    一:FileList对象与file对象 FileList对象表示用户选择的文件列表,在HTML4中,file控件内只允许放置一个文件,但是到了HTML5中,通过添加multiple属性,file控件内 ...

  4. 如何更改firefox默认搜索引擎?一步搞定!

    由于开发设计的需要,ytkah平时习惯使用firefox作为默认浏览器,火狐浏览器可添加的扩展功能比较,比如firebug.nofollow.seoquake等,还有比较友好的功能就是选中关键词拖动直 ...

  5. js实现table排序-sortable.js

    方案一.引用sortable.js包 /* <th class="thcss" style="width: 40px;" onclick="so ...

  6. Android 将可以按地点自动启动应用程序

    导读Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称,中国大陆地区较多人使用“安 ...

  7. Powershell学习之道-文件夹共享及磁盘映射

    导读 在Linux环境下,我们很轻易就能得心应手地通过命令操作一切事物,在Windows下,Powershell也算是后起之秀,提供大量的cmdlet以及c#的横向拓展.下面将由小编带领大家通过Pow ...

  8. Ubuntu下为Firefox安装Adobe Flash Player

      使用环境:     OS:Ubuntu 12.04 LTS     Browser: Firefox 12.0     Adobe Flash Player: install_flash_play ...

  9. ZeroMQ(java)之Router与Dealer运行原理

    在开始这部分的内容之前,先来看看ZeroMQ中HWM概念---High-Water Marks 当系统的数据量很大,而且发送频率很高的情况下,内存就很重要了,如果处理不好会出现很多问题,例如如下场景: ...

  10. 将XML解析成DOM文档

    在支持html5的浏览其中,可以使用标准解析器DOMParser对象进行解析html或者xml等字符串 var data = '<div></div>'; var tmp = ...