`
jandroid
  • 浏览: 1896362 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android提高第七篇之XML解析与生成

阅读更多

 本 文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱 动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。

本文要解析的test.xml文件如下:

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>    
  2. < test >    
  3.   < title > testSAX </ title >    
  4.     < content   aa = "1"   bb = "2" >    
  5.       < name > hellogv </ name >    
  6.       < url > http://blog.csdn.net/hellogv </ url >    
  7.     </ content >   
  8. </ test >    
 

解析如上XML的结果如下:

 

使 用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。

  1. SAXParserFactory factory = SAXParserFactory.newInstance();  
  2. SAXParser parser = factory.newSAXParser();  
  3. XMLReader reader = parser.getXMLReader();  
  4. reader.setContentHandler(handler);  
  5. reader.parse(new  InputSource(testSAX. this .getResources()  
  6.         .openRawResource(R.raw.test)));  

在 这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。DefaultHandler已实现 ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码。

生成XML的结果如下:

上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。

本文的main.xml代码如下:

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2. < LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"   
  3.     android:orientation = "vertical"   android:layout_width = "fill_parent"   
  4.     android:layout_height = "fill_parent" >   
  5.   
  6.     < Button   android:layout_height = "wrap_content"   
  7.         android:layout_width = "fill_parent"   android:id = "@+id/btnSAX"   
  8.         android:text = "使用SAX解析XML" > </ Button >   
  9.     < Button   android:layout_height = "wrap_content"   
  10.         android:layout_width = "fill_parent"   android:text = "生成XML"   android:id = "@+id/btnOutput" > </ Button >   
  11.     < EditText   android:text = "@+id/EditText01"   android:id = "@+id/EditText01"   
  12.         android:layout_width = "fill_parent"   android:layout_height = "fill_parent" > </ EditText >   
  13.   
  14. </ LinearLayout >   

SAXHandler.java的源码如下:

  1. package  com.testSAX;  
  2.   
  3. import  java.util.ArrayList;  
  4. import  org.xml.sax.Attributes;  
  5. import  org.xml.sax.SAXException;  
  6. import  org.xml.sax.helpers.DefaultHandler;  
  7.   
  8. import  android.util.Log;  
  9.   
  10. public   class  SAXHandler  extends  DefaultHandler{  
  11.         private  ArrayList<String> keys =  new  ArrayList<String>(); //保存字段名称   
  12.         private  ArrayList<Object> values =  new  ArrayList<Object>(); //保存值   
  13.         @Override   
  14.         public   void  startDocument()  throws  SAXException {  
  15.             super .startDocument();  
  16.   
  17.         }  
  18.   
  19.         @Override   
  20.         public   void  endDocument()  throws  SAXException {  
  21.             super .endDocument();  
  22.         }  
  23.   
  24.         @Override   
  25.         public   void  startElement(String uri, String localName, String qName,  
  26.                 Attributes attributes) throws  SAXException {  
  27.             //保存开始标记   
  28.             keys.add("startTag" );  
  29.             values.add(localName);  
  30.   
  31.             Log.e("startTag" ,localName);  
  32.             //保存属性值   
  33.             for  (  int  i =  0 ; i < attributes.getLength(); i++ ){  
  34.                 keys.add("Attr" );  
  35.                 String[] str=new  String[ 2 ];  
  36.                 str[0 ]=attributes.getLocalName(i);  
  37.                 str[1 ]=attributes.getValue(i);  
  38.                 values.add(str);  
  39.                 Log.e("Attr" ,str[ 0 ]+ "=" +str[ 1 ]);  
  40.                 }  
  41.         }  
  42.   
  43.         @Override   
  44.         public   void  endElement(String uri, String localName, String qName)  
  45.                 throws  SAXException {  
  46.             //保存结束标记   
  47.             keys.add("endTag" );  
  48.             values.add(localName);  
  49.             Log.e("endTag" ,localName);  
  50.         }  
  51.   
  52.         @Override   
  53.         public   void  characters( char [] ch,  int  start,  int  length)  
  54.                 throws  SAXException {  
  55.             String value = new  String(ch, start, length);  
  56.             value = value.trim();  
  57.             if  (value.length() ==  0 )  
  58.                 return ;  
  59.               
  60.             keys.add("text" );  
  61.             values.add(value);  
  62.             Log.e("text" ,value);  
  63.         }  
  64.           
  65.         public  ArrayList<String> GetKeys()  
  66.         {  
  67.             return  keys;  
  68.         }  
  69.           
  70.         public  ArrayList<Object> GetValues()  
  71.         {  
  72.             return  values;  
  73.         }  
  74.           
  75.   
  76. }  

testSAX.java的源码如下:

  1. package  com.testSAX;  
  2.   
  3. import  java.io.StringWriter;  
  4.   
  5. import  javax.xml.parsers.SAXParser;  
  6. import  javax.xml.parsers.SAXParserFactory;  
  7.   
  8. import  org.xml.sax.InputSource;  
  9. import  org.xml.sax.XMLReader;  
  10. import  org.xmlpull.v1.XmlSerializer;  
  11.   
  12. import  android.app.Activity;  
  13. import  android.os.Bundle;  
  14.   
  15. import  android.util.Xml;  
  16. import  android.view.View;  
  17. import  android.widget.Button;  
  18. import  android.widget.EditText;  
  19.   
  20. public   class  testSAX  extends  Activity {  
  21.     /** Called when the activity is first created. */   
  22.     Button btnSAX, btnOutput;  
  23.     EditText memo;  
  24.     SAXHandler handler = new  SAXHandler();  
  25.   
  26.       
  27.     @Override   
  28.     public   void  onCreate(Bundle savedInstanceState) {  
  29.         super .onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         btnSAX = (Button) this .findViewById(R.id.btnSAX);  
  32.         btnSAX.setOnClickListener(new  ClickEvent());  
  33.         btnOutput = (Button) this .findViewById(R.id.btnOutput);  
  34.         btnOutput.setOnClickListener(new  ClickEvent());  
  35.         memo = (EditText) this .findViewById(R.id.EditText01);  
  36.   
  37.     }  
  38.   
  39.     class  ClickEvent  implements  View.OnClickListener {  
  40.   
  41.         @Override   
  42.         public   void  onClick(View v) {  
  43.             if  (v == btnSAX) { //解析XML,并保存标记,属性等值   
  44.                 try  {  
  45.                     SAXParserFactory factory = SAXParserFactory.newInstance();  
  46.                     SAXParser parser = factory.newSAXParser();  
  47.                     XMLReader reader = parser.getXMLReader();  
  48.                     reader.setContentHandler(handler);  
  49.                     reader.parse(new  InputSource(testSAX. this .getResources()  
  50.                             .openRawResource(R.raw.test)));  
  51.                 } catch  (Exception ee) {}  
  52.             }  
  53.             else   if  (v == btnOutput) { //生成XML   
  54.                 try  {  
  55.                     XmlSerializer serializer = Xml.newSerializer();  
  56.                     StringWriter writer = new  StringWriter();  
  57.                     try  {  
  58.                         serializer.setOutput(writer);  
  59.                         serializer.startDocument("UTF-8" , true );  
  60.                           
  61.                         for ( int  i= 0 ;i<handler.GetKeys().size();i++)  
  62.                         {  
  63.                             if (handler.GetKeys().get(i).equals( "startTag" ))  
  64.                             {  
  65.                                 serializer.startTag("" , (String) handler.GetValues().get(i));  
  66.                             }  
  67.                             else   if (handler.GetKeys().get(i).equals( "Attr" )){  
  68.                                 String[] str= (String[]) handler.GetValues().get(i);  
  69.                                 serializer.attribute("" ,str[ 0 ],str[ 1 ]);  
  70.                             }  
  71.                             else   if (handler.GetKeys().get(i).equals( "text" ))  
  72.                                 serializer.text((String)handler.GetValues().get(i));  
  73.                             else   if (handler.GetKeys().get(i).equals( "endTag" ))  
  74.                             {  
  75.                                 serializer.endTag("" , (String) handler.GetValues().get(i));  
  76.                             }  
  77.                         }  
  78.                         serializer.endDocument();  
  79.                         String text=writer.toString();  
  80.                         text=text.replace("><" ">\r\n<" );  
  81.                         memo.setText(text);//输出到文本框   
  82.                     } catch  (Exception e) {  
  83.                         throw   new  RuntimeException(e);  
  84.                     }  
  85.                       
  86.                 } catch  (Exception e) {}  
  87.             }  
  88.   
  89.         }  
  90.   
  91.     }  

3
1
分享到:
评论

相关推荐

    Android提高第七篇之XML解析与生成.docx

    Android提高第七篇之XML解析与生成.docx

    Android提高第七篇之XML解析与生成.doc

    Android提高第七篇之XML解析与生成

    Android开发与应用——张荣,原书配套课件

    第7章 多线程及消息处理 7.1 Android多线程概述 7.1.1 创建线程 7.1.2 操作线程 7.2 UI线程与非UI线程 7.3 多线程中的常用类 7.3.1 Handler类 7.3.2 AsyncTask类 7.3.3 Timer定时器 7.4 Android...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    android群雄传

    第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 ...

    疯狂Android讲义源码

     10.1.3 绑定本地Service并与之  通信 377  10.1.4 Service的生命周期 381  10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——...

    黎活明android教程的全程PPT

    5&gt; XML解析(SAX/DOM/PULL),写xml文件 6&gt; SharedPreferences 第三天 1&gt; SQLite数据库添删改查操作 A.创建数据库 B.SQLiteOpenHelper自动创建数据库的原理实现 C.数据库版本变化 D.编写代码完成添删改查操作(两...

    Google Android SDK开发范例大全的目录

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——...

    Google Android SDK开发范例大全(第3版) 1/5

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽和高 7.2 绘制几何图形 7.3 手机屏幕保护程序 7.4 用手指移动画面里的照片 7.5 加载存储卡的Gallery相簿 7.6 取得手机内置媒体中的图片文件 7.7 相片导航向导与设置背景...

    Google Android SDK开发范例大全(第3版) 4/5

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽和高 7.2 绘制几何图形 7.3 手机屏幕保护程序 7.4 用手指移动画面里的照片 7.5 加载存储卡的Gallery相簿 7.6 取得手机内置媒体中的图片文件 7.7 相片导航向导与设置背景...

    android开发秘籍

    第7 章 硬件接口 140 7.1 照相机 140 7.2 其他传感器 145 7.2.1 秘诀57:获取设备旋转姿态 146 7.2.2 秘诀58:使用温度传感器和光传感器 149 7.3 电话 150 7.3.1 秘诀59:使用电话管理器 150 7.3.2 秘诀60:...

    Google Android SDK开发范例大全(第3版) 3/5

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽和高 7.2 绘制几何图形 7.3 手机屏幕保护程序 7.4 用手指移动画面里的照片 7.5 加载存储卡的Gallery相簿 7.6 取得手机内置媒体中的图片文件 7.7 相片导航向导与设置背景...

    Google Android SDK开发范例大全(第3版) 5/5

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽和高 7.2 绘制几何图形 7.3 手机屏幕保护程序 7.4 用手指移动画面里的照片 7.5 加载存储卡的Gallery相簿 7.6 取得手机内置媒体中的图片文件 7.7 相片导航向导与设置背景...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片...

Global site tag (gtag.js) - Google Analytics