在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同

1)SAX:(Simple API for XML这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:

void startDocument()//文档开始时触发该方法

void endDocument()//文档结束时

void startElement(String uri, String localName, String qName, Attributes atts)//元素开始

void endElement(String uri, String localName, String qName)//元素结束

void characters(char[ ] ch, int start, int length)//文本节点

创建SAX解析器:

  (1)用系统默认值来创建一个XMLReader(解析器):

  XMLReader reader = XMLReaderFactory.createXMLReader();

  (2)从给定的类名称来创建一个XMLReader:

  XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");

  (3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:

  SAXParserFactory spFactory = SAXParserFactory.newInstance();

SAXParser sParser = spFactory.newSAXParser();

2)DOM:(Document Object Model文档对象模型,它是基于对象的,又或者基于树的。它属于两次加载,首先把文档载入内存,第二次把文档解析形成一棵树。如果文档过大对内存占用是很大的。但它也有其优点,它可以解析的过程中修改文件树,可以随便存储文件树的任意部分,相对容易理解。

3)Pull解析:android中内置了pull解析包。这也是android程序中所推荐的xml解析方式。从它的字面上就可以看出来,其优点,pull,拉的意思。我要什么资源我就拿什么资源。我只需要xml文件中一部分,我就拉一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。Pull解析也非常易于理解。

先上图:

我们就用这三种方式对同一个XML文件进行解析:

Xml代码
  1. <?xmlversion="1.0"?>
  2. <persons>
  3. <personid="1">
  4. <name>tom</name>
  5. <age>13</age>
  6. </person>
  7. <personid="2">
  8. <name>jerry</name>
  9. <age>14</age>
  10. </person>
  11. <personid="3">
  12. <name>john</name>
  13. <age>34</age>
  14. </person>
  15. </persons>

SAX解析代码:

Java代码
  1. packagecom.iteye.androidtoast.resolver;
  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. importandroid.util.Log;
  11. importcom.iteye.androidtaost.model.Person;
  12. importcom.iteye.androidtaost.service.ParseService;
  13. publicclassSaximplementsParseService{
  14. /*SAX解析,是基于事件的,一次性加载*/
  15. privateSAXParserparser;
  16. publicSax(){
  17. //实例化解析工厂
  18. SAXParserFactoryf=SAXParserFactory.newInstance();
  19. try{
  20. parser=f.newSAXParser();
  21. }catch(Exceptione){
  22. e.printStackTrace();
  23. Log.i("Sax",e.getMessage());
  24. }
  25. }
  26. @Override
  27. publicList<Person>doParse(InputStreamin){
  28. XmlHandlerh=newXmlHandler();
  29. try{
  30. parser.parse(in,h);
  31. }catch(Exceptione){
  32. //TODOAuto-generatedcatchblock
  33. e.printStackTrace();
  34. }
  35. returnh.getPersons();
  36. }
  37. /*
  38. *处理器
  39. */
  40. classXmlHandlerextendsDefaultHandler{
  41. List<Person>persons=null;
  42. privatePersonp;
  43. privateObjectcurrentEleName;
  44. /**
  45. *开始解析文档的时候实例化集合
  46. */
  47. @Override
  48. publicvoidstartDocument()throwsSAXException{
  49. persons=newArrayList<Person>();
  50. }
  51. @Override
  52. publicvoidendDocument()throwsSAXException{
  53. //TODOAuto-generatedmethodstub
  54. super.endDocument();
  55. }
  56. /**
  57. *元素开始
  58. */
  59. @Override
  60. publicvoidstartElement(Stringuri,StringlocalName,StringqName,
  61. Attributesattributes)throwsSAXException{
  62. if("person".equals(localName)){
  63. p=newPerson();//节点开始的时候实例化person
  64. p.id=newInteger(attributes.getValue(0));//得到ID
  65. }elseif("name".equals(localName)){
  66. this.currentEleName="name";
  67. }elseif("age".equals(localName)){
  68. this.currentEleName="age";
  69. }
  70. }
  71. /**
  72. *元素结束事件
  73. */
  74. @Override
  75. publicvoidendElement(Stringuri,StringlocalName,StringqName)
  76. throwsSAXException{
  77. //解析到文档末尾
  78. if("person".equals(localName)){
  79. //将解析完成的对象添加到集合
  80. persons.add(p);
  81. }elseif("name".equals(localName)||"age".equals(localName)){
  82. this.currentEleName="";
  83. }
  84. }
  85. /**)
  86. *用户处理字符节点
  87. */
  88. @Override
  89. publicvoidcharacters(char[]ch,intstart,intlength)
  90. throwsSAXException{
  91. Stringstr=newString(ch,start,length);
  92. if("name".equals(currentEleName)){
  93. p.name=str;
  94. }elseif("age".equals(currentEleName)){
  95. p.age=newInteger(str);
  96. }
  97. }
  98. publicList<Person>getPersons(){
  99. returnpersons;
  100. }
  101. }
  102. }

DOM解析代码:

Java代码
  1. packagecom.iteye.androidtoast.resolver;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.util.ArrayList;
  5. importjava.util.List;
  6. importjavax.xml.parsers.DocumentBuilder;
  7. importjavax.xml.parsers.DocumentBuilderFactory;
  8. importjavax.xml.parsers.ParserConfigurationException;
  9. importorg.w3c.dom.Document;
  10. importorg.w3c.dom.Element;
  11. importorg.w3c.dom.NodeList;
  12. importorg.xml.sax.SAXException;
  13. importcom.iteye.androidtaost.model.Person;
  14. importcom.iteye.androidtaost.service.ParseService;
  15. /*
  16. *DOM解析
  17. */
  18. publicclassDomimplementsParseService{
  19. /**
  20. *文档构建器
  21. */
  22. privateDocumentBuilderbuilder;
  23. privatePersonperson;
  24. publicDom(){
  25. //获取构建器
  26. DocumentBuilderFactoryf=DocumentBuilderFactory.newInstance();
  27. try{
  28. builder=f.newDocumentBuilder();
  29. }catch(ParserConfigurationExceptione){
  30. e.printStackTrace();
  31. }
  32. }
  33. @Override
  34. publicList<Person>doParse(InputStreamin){
  35. List<Person>persons=newArrayList<Person>();
  36. try{
  37. Documentdoc=builder.parse(in);
  38. NodeListlist=doc.getElementsByTagName("person");
  39. for(inti=0;i<list.getLength();i++){
  40. //提取Person元素
  41. Elementel=(Element)list.item(i);
  42. person=newPerson();
  43. //获取ID节点
  44. person.id=newInteger(el.getAttribute("id"));
  45. person.name=getSubelementTextContentByName(el,"name");
  46. person.age=newInteger(getSubelementTextContentByName(el,"age"));
  47. persons.add(person);
  48. }
  49. returnpersons;
  50. }catch(SAXExceptione){
  51. e.printStackTrace();
  52. }catch(IOExceptione){
  53. e.printStackTrace();
  54. }
  55. returnnull;
  56. }
  57. /**
  58. *得到指定元素的子元素文本节点(
  59. *@paramel父元素
  60. *@paramname子元素名称
  61. *@return
  62. */
  63. privateStringgetSubelementTextContentByName(Elementel,Stringname){
  64. NodeListlist=el.getElementsByTagName(name);
  65. Elemente=(Element)list.item(0);
  66. returne.getTextContent();
  67. }
  68. }

Pull解析代码:

Java代码
  1. packagecom.iteye.androidtoast.resolver;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.util.ArrayList;
  5. importjava.util.List;
  6. importorg.xmlpull.v1.XmlPullParser;
  7. importorg.xmlpull.v1.XmlPullParserException;
  8. importandroid.util.Xml;
  9. importcom.iteye.androidtaost.model.Person;
  10. importcom.iteye.androidtaost.service.ParseService;
  11. publicclassPullimplementsParseService{
  12. privateStringtagName;
  13. @Override
  14. publicList<Person>doParse(InputStreamin){
  15. List<Person>persons=null;
  16. Personperson=null;
  17. XmlPullParserparser=Xml.newPullParser();
  18. try{
  19. parser.setInput(in,"utf-8");
  20. //获取事件类型
  21. inteventType=parser.getEventType();
  22. while(eventType!=XmlPullParser.END_DOCUMENT){
  23. switch(eventType){
  24. //文档开始
  25. caseXmlPullParser.START_DOCUMENT:
  26. persons=newArrayList<Person>();
  27. break;
  28. caseXmlPullParser.START_TAG:
  29. tagName=parser.getName();
  30. if("person".equals(tagName)){
  31. person=newPerson();
  32. person.id=newInteger(parser.getAttributeValue(0));
  33. }elseif("name".equals(tagName)){
  34. person.name=parser.nextText();
  35. }elseif("age".equals(tagName)){
  36. person.age=newInteger(parser.nextText());
  37. }
  38. break;
  39. caseXmlPullParser.END_TAG:
  40. if("person".equals(parser.getName())){
  41. persons.add(person);
  42. }
  43. break;
  44. }
  45. eventType=parser.next();
  46. }
  47. }catch(XmlPullParserExceptione){
  48. //TODOAuto-generatedcatchblock
  49. e.printStackTrace();
  50. }catch(IOExceptione){
  51. //TODOAuto-generatedcatchblock
  52. e.printStackTrace();
  53. }
  54. returnpersons;
  55. }
  56. }
  57. 转载自http://androidtoast.iteye.com/blog/1187662

更多相关文章

  1. 为Android应用程序读取/dev下设备而提权(二)
  2. Android读写XML(中)——SAX
  3. androidのPULL方式解析XML
  4. Android(安卓)创建与解析XML(一)—— 概述
  5. Android中使用pull解析器操作xml文件的解决办法
  6. Android如何解析Intent Filter
  7. Android(安卓)异步消息处理机制(Handler 、 Looper 、MessageQueu
  8. [置顶] Android学习系列-Android中解析xml(7)
  9. Android(安卓)下用 Pull 解析和生成 XML

随机推荐

  1. 关于新版SDK报错You need to use a Theme
  2. 关于Android(安卓)混淆的内容总结
  3. Android环境搭建-Eclipse-Luna
  4. relativelayout常用属性
  5. Android:CoordinatorLayout使用详解
  6. Android之TabHost
  7. Android--边距(margin)与内边距(padding)
  8. LinearLayout按下(pressed)或获取焦点(foc
  9. 推荐几个比较好的android客户端开发教程
  10. Android(安卓)UI(8)Building Apps with U