android之sax解析xml文件


beauties.xml

[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beauties>
  3. <beauty>
  4. <name>林志玲</name>
  5. <age>28</age>
  6. </beauty>
  7. <beauty>
  8. <name>杨幂</name>
  9. <age>23</age>
  10. </beauty>
  11. </beauties>

main.xml

[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/textView"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. />
  12. </LinearLayout>

activity的代码:

[java] view plain copy
  1. packagecn.com.saxtest;
  2. importjava.io.InputStream;
  3. importjava.util.ArrayList;
  4. importjavax.xml.parsers.SAXParser;
  5. importjavax.xml.parsers.SAXParserFactory;
  6. importorg.xml.sax.Attributes;
  7. importorg.xml.sax.SAXException;
  8. importorg.xml.sax.helpers.DefaultHandler;
  9. importandroid.app.Activity;
  10. importandroid.os.Bundle;
  11. importandroid.util.Log;
  12. importandroid.widget.TextView;
  13. /**
  14. *
  15. *@authorchenzheng_java
  16. *@description使用sax解析方式解析xml
  17. *@since2010/03/04
  18. *
  19. */
  20. publicclassSaxParserActivityextendsActivity{
  21. privateArrayList<Beauty>beautyList=newArrayList<Beauty>();
  22. privateBeautybeauty=null;
  23. @Override
  24. publicvoidonCreate(BundlesavedInstanceState){
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. SAXParserFactoryfactory=SAXParserFactory.newInstance();
  28. try{
  29. SAXParserparser=factory.newSAXParser();
  30. InputStreaminputStream=this.getClassLoader()
  31. .getResourceAsStream("beauties.xml");
  32. parser.parse(inputStream,newMyDefaultHandler());
  33. Stringresult="";
  34. for(Beautybeauty:beautyList){
  35. result+="/n"+beauty.toString();
  36. }
  37. TextViewtextView=(TextView)findViewById(R.id.textView);
  38. textView.setText(result);
  39. }catch(Exceptione){
  40. e.printStackTrace();
  41. }
  42. }
  43. /**
  44. *
  45. *@authorchenzheng_java
  46. *@description一定要注意,这里是使用的内部类哦。有些朋友可能有疑问,不用内部类不可以,答案是:当然可以。
  47. *这里用内部类的目的其实就是为了提高一丁点效率而已。如果你喜欢看源码,你就会发现,源码中大量的使用了内部类的。
  48. *
  49. */
  50. privateclassMyDefaultHandlerextendsDefaultHandler{
  51. //存储目前为止读取到的最后一个element的localname
  52. privateStringcurrentElementName="";
  53. /**
  54. *characters(charch[],intstart,intlength)当解析xml中遇到文本内容时会执行。ch
  55. *这个数组中存放的是整个xml文件的字符串的数组形式start是当前解析的文本在整个xml字符串文件中的开始位置
  56. *length是当前解析的文本内容的长度由上面的介绍我们可以知道,我们可以通过new
  57. *String(ch,start,length)方法来获取我们正解析的文本内容
  58. */
  59. @Override
  60. publicvoidcharacters(char[]ch,intstart,intlength)
  61. throwsSAXException{
  62. Log.i("currentElementName",currentElementName);
  63. StringtextContent=newString(ch,start,length);
  64. if(currentElementName.equals("name")&&textContent!=null&&!textContent.trim().equals("")){
  65. Log.i("textContentname",textContent);
  66. beauty.setName(textContent);
  67. }
  68. if(currentElementName.equals("age")&&textContent!=null&&!textContent.trim().equals("")){
  69. Log.i("textContentage",textContent);
  70. beauty.setAge(textContent);
  71. }
  72. }
  73. /**
  74. *解析到xml文档的末尾时触发
  75. */
  76. @Override
  77. publicvoidendDocument()throwsSAXException{
  78. }
  79. /**
  80. *解析到元素的末尾时触发
  81. */
  82. @Override
  83. publicvoidendElement(Stringuri,StringlocalName,StringqName)
  84. throwsSAXException{
  85. if(localName.equals("beauty")){
  86. beautyList.add(beauty);
  87. Log.i("beauty",beauty.toString());
  88. }
  89. }
  90. /**
  91. *开始解析xml时触发
  92. */
  93. @Override
  94. publicvoidstartDocument()throwsSAXException{
  95. }
  96. /**
  97. *解析到元素的开始处触发startElement(Stringuri,StringlocalName,StringqName,
  98. *Attributesattributes)uri:Namespace值,当用户没有明确指定以及当命名空间没有被使用的时候,为null
  99. *localName:element的名称,或者通俗点叫标签的名称。如<name>中的name就是localNameqName:
  100. *和localName的唯一其别是
  101. *,当标签有namespace时,该值返回的数据为全限定名称。例如<chen:name>中,localName为name
  102. *,qName为chen:nameattributes:元素包含的属性对象。如果没有属性时,返回一个空的属性对象
  103. */
  104. @Override
  105. publicvoidstartElement(Stringuri,StringlocalName,StringqName,
  106. Attributesattributes)throwsSAXException{
  107. currentElementName=localName;
  108. if(localName.equals("beauty")){
  109. beauty=newBeauty();
  110. }
  111. }
  112. }
  113. /**
  114. *
  115. *@authorchenzheng这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间
  116. *
  117. */
  118. privateclassBeauty{
  119. Stringname;
  120. Stringage;
  121. publicStringgetName(){
  122. returnname;
  123. }
  124. publicvoidsetName(Stringname){
  125. this.name=name;
  126. }
  127. publicStringgetAge(){
  128. returnage;
  129. }
  130. publicvoidsetAge(Stringage){
  131. this.age=age;
  132. }
  133. @Override
  134. publicStringtoString(){
  135. return"美女资料[年龄="+getAge()+",姓名="+getName()+"]";
  136. }
  137. }
  138. }

运行后就会得到想要的结果了、

代码结构:

----------------------------------------------------------------------------------------------------------

下面,再让我们一起讨论点废话:

SAX 解析 1. SAX ( Simple Application interface for XML ), 是一组程序设计接口,采用 observer 模式,将XML文件视为一个文字流的数据,在读取XML 元素时触发一系列的事件。这是观察者模式的一个典型应用。

2. 使用SAX 加载XML文件时,他的操作像打开一个“顺序的文件字符流”,在读到XML元素的开始标记,结尾标记和内容标记时将产生一系列的事件
如一个简单的XML文件:<hello><message>hello XML!</message></hello>
会相应的触发:startDocument, startElement, characters, endElement, endDocument, 只需编写这些事件处理程序就可以解析XML文件了

3. SAX 可以高效的使用内存,因为SAX 只是顺序的读取XML 文件的内容,并不会将XML 文件完全加载,这样就比DOM 的处理效率高
但SAX 只能读取XML 文件的内容,而不能更改XML 的内容,也不能随机访问XML 元素

4. 在SAX 中有4个处理器是要实现的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以处理不同的事件,这是比较麻烦的,
幸好SAX 定义了一个 DefaultHandler 类把这几个实现了,我们只需在 DefaultHandler中定义事件处理方法,然后注册到XMLReader,而SAXParser封装了XMLReader的实现类,
SAXParser又是由SAXParserFactory提供的,所以我们实际用到的类只有:SAXParserFactory,SAXParser,DefaultHandler

5. SAX 的解析步骤:
(1)写一个类继承 DefaultHandler, 实现自己的事件处理方法
(2)在主程序中建立 SAXParserFactory
(3)可以设置这个factory 的参数
(4)从这个factory 得到SAXParser
(5)解析XML文件

更多相关文章

  1. android 报错问题解析
  2. 49 Android(安卓)fragment 自定义适配器adapter
  3. Android文件操作
  4. java.lang.NoSuchFieldError: com.banwxf.shoplibrary.R$id.page
  5. android 文件保存方法 sd卡中或系统
  6. [Android]关于filed 遍历资源文件的排序问题
  7. android 文件上传
  8. android一种较为复杂的布局参考(xml文件)
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)自定义button简单示例
  2. android的几种网络请求方式详解
  3. Android(安卓)屏幕适配之屏幕分辨率(创建
  4. Android 中 java 与 webview 的交互
  5. 安卓入门及界面带参数跳转
  6. android studio 获取签名(秘钥口令android
  7. Android(安卓)Studio安装过程中出现Faile
  8. Android 4高级编程(第三版)Android简介
  9. Android学习笔记十五之TableLayout表格布
  10. N 个 Android(安卓)项目源码