Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3518798
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: Java

2010-11-15 19:43:07

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

       本 文使用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>testSAXtitle>   
  4.     <content aa="1" bb="2">   
  5.       <name>hellogvname>   
  6.       <url>http://blog.csdn.net/hellogvurl>   
  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=""  
  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 keys = new ArrayList();//保存字段名称  
  12.         private ArrayList values = new ArrayList();//保存值  
  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 GetKeys()  
  66.         {  
  67.             return keys;  
  68.         }  
  69.           
  70.         public ArrayList GetValues()  
  71.         {  
  72.             return values;  
  73.         }  
  74.           
  75.   
  76. }  
  77. 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
    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.     }  

    阅读(923) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~