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。

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

2)

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

[java] view plain copy
  1. packagecn.itcast.service;
  2. importjava.io.InputStream;
  3. importjava.util.ArrayList;
  4. importjava.util.List;
  5. importjavax.xml.parsers.SAXParser;
  6. importjavax.xml.parsers.SAXParserFactory;
  7. importorg.xml.sax.Attributes;
  8. importorg.xml.sax.SAXException;
  9. importorg.xml.sax.helpers.DefaultHandler;
  10. importcn.itcast.model.Person;
  11. publicclassSAXPersonService{
  12. publicList<Person>getPersons(InputStreaminStream)throwsThrowable
  13. {
  14. SAXParserFactoryfactory=SAXParserFactory.newInstance();//工厂模式还是单例模式?
  15. SAXParserparser=factory.newSAXParser();
  16. PersonParsepersonParser=newPersonParse();
  17. parser.parse(inStream,personParser);
  18. inStream.close();
  19. returnpersonParser.getPerson();
  20. }
  21. privatefinalclassPersonParseextendsDefaultHandler
  22. {
  23. privateList<Person>list=null;
  24. Personperson=null;
  25. privateStringtag=null;
  26. publicList<Person>getPerson(){
  27. returnlist;
  28. }
  29. @Override
  30. publicvoidstartDocument()throwsSAXException{
  31. list=newArrayList<Person>();
  32. }
  33. @Override
  34. publicvoidstartElement(Stringuri,StringlocalName,StringqName,
  35. Attributesattributes)throwsSAXException{
  36. if("person".equals(localName))
  37. {
  38. //xml元素节点开始时触发,是“person”
  39. person=newPerson();
  40. person.setId(newInteger(attributes.getValue(0)));
  41. }
  42. tag=localName;//保存元素节点名称
  43. }
  44. @Override
  45. publicvoidendElement(Stringuri,StringlocalName,StringqName)
  46. throwsSAXException{
  47. //元素节点结束时触发,是“person”
  48. if("person".equals(localName))
  49. {
  50. list.add(person);
  51. person=null;
  52. }
  53. tag=null;//结束时,需要清空tag
  54. }
  55. @Override
  56. publicvoidcharacters(char[]ch,intstart,intlength)
  57. throwsSAXException{
  58. if(tag!=null)
  59. {
  60. Stringdata=newString(ch,start,length);
  61. if("name".equals(tag))
  62. {
  63. person.setName(data);
  64. }elseif("age".equals(tag))
  65. {
  66. person.setAge(newInteger(data));
  67. }
  68. }
  69. }
  70. }
  71. }

3)

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

[java] view plain copy
  1. packagecn.itcast.service;
  2. importjava.io.InputStream;
  3. importjava.io.Writer;
  4. importjava.util.ArrayList;
  5. importjava.util.List;
  6. importorg.xmlpull.v1.XmlPullParser;
  7. importorg.xmlpull.v1.XmlSerializer;
  8. importandroid.util.Xml;
  9. importcn.itcast.model.Person;
  10. publicclassPullPersonService{
  11. //保存xml文件
  12. publicstaticvoidsaveXML(List<Person>list,Writerwrite)throwsThrowable
  13. {
  14. XmlSerializerserializer=Xml.newSerializer();//序列化
  15. serializer.setOutput(write);//输出流
  16. serializer.startDocument("UTF-8",true);//开始文档
  17. serializer.startTag(null,"persons");
  18. //循环去添加person
  19. for(Personperson: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. publicList<Person>getPersons(InputStreamstream)throwsThrowable
  36. {
  37. List<Person>list=null;
  38. Personperson=null;
  39. XmlPullParserparser=Xml.newPullParser();
  40. parser.setInput(stream,"UTF-8");
  41. inttype=parser.getEventType();//产生第一个事件
  42. //只要当前事件类型不是”结束文档“,就去循环
  43. while(type!=XmlPullParser.END_DOCUMENT)
  44. {
  45. switch(type){
  46. caseXmlPullParser.START_DOCUMENT:
  47. list=newArrayList<Person>();
  48. break;
  49. caseXmlPullParser.START_TAG:
  50. Stringname=parser.getName();//获取解析器当前指向的元素名称
  51. if("person".equals(name))
  52. {
  53. person=newPerson();
  54. person.setId(newInteger(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(newInteger(parser.nextText()));
  65. }
  66. }
  67. break;
  68. caseXmlPullParser.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. returnlist;
  79. }
  80. }

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

[java] view plain copy
  1. packagecn.itcast.model;
  2. publicclassPerson{
  3. privateIntegerid;
  4. publicIntegergetId(){
  5. returnid;
  6. }
  7. publicvoidsetId(Integerid){
  8. this.id=id;
  9. }
  10. privateStringname;
  11. publicStringgetName(){
  12. returnname;
  13. }
  14. publicvoidsetName(Stringname){
  15. this.name=name;
  16. }
  17. privateIntegerage;
  18. publicIntegergetAge(){
  19. returnage;
  20. }
  21. publicvoidsetAge(Integerage){
  22. this.age=age;
  23. }
  24. publicPerson()
  25. {
  26. }
  27. publicPerson(Integerid,Stringname,Integerage){
  28. this.id=id;
  29. this.name=name;
  30. this.age=age;
  31. }
  32. @Override
  33. publicStringtoString(){
  34. return"Person[id="+id+",name="+name+",age="+age+"]";
  35. }
  36. }

更多相关文章

  1. Android(安卓)开发布局 线性布局---LinearLayout
  2. Android布局文件的属性值解析
  3. Android(安卓)JSON解析示例代码
  4. Xml解析之----Pull
  5. Android(安卓)Framework解析
  6. android pull dom解析xml
  7. Android(安卓)7.0版本升级解析包错误
  8. Android适配器之-----SimpleExpandableListAdapter
  9. Android(安卓)从网上获取网页代码(未解析)

随机推荐

  1. Android学习路线_入门篇(一)编写简单的APP
  2. android通过USB使用真机调试程序
  3. android 横向,竖向滚动Gridveiw
  4. Android APK反编译详解(附图)
  5. 隐藏Android(安卓)系统自带的v7.widget.T
  6. Android webView 正确的用法
  7. Android.mk简介
  8. 02_Android应用开发之Hello World【图解
  9. android插件开发,使用360加固自动多渠道
  10. Android的Broadcast Receicer解析