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

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

XML/HTML代码
  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的结果如下: 

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

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

Java代码
  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的操作。生成XML的结果如下:

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

       上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。本文的main.xml代码如下:

XML/HTML代码
  1. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         android:orientation="vertical" android:layout_width="fill_parent"  
  3.         android:layout_height="fill_parent">  
  4.   
  5.         <button android:layout_height="wrap_content"   
  6.                 android:layout_width="fill_parent" android:id="@+id/btnSAX"  
  7.                 android:text="使用SAX解析XML">  
  8.         <button android:layout_height="wrap_content"   
  9.                 android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput">  
  10.         <edittext android:text="@+id/EditText01" android:id="@+id/EditText01"   
  11.                 android:layout_width="fill_parent" android:layout_height="fill_parent">  

       testSAX.java的源码如下:

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.    class ClickEvent implements View.OnClickListener {    
  39.       @Override  
  40.       public void onClick(View v) {  
  41.           if (v == btnSAX) {//解析XML,并保存标记,属性等值  
  42.               try {  
  43.                  SAXParserFactory factory = SAXParserFactory.newInstance();  
  44.                  SAXParser parser = factory.newSAXParser();  
  45.                  XMLReader reader = parser.getXMLReader();  
  46.                  reader.setContentHandler(handler);  
  47.                  reader.parse(new InputSource(testSAX.this.getResources()  
  48.                                                         .openRawResource(R.raw.test)));  
  49.               } catch (Exception ee) {}  
  50.           } else if (v == btnOutput) {//生成XML  
  51.               try {  
  52.                  XmlSerializer serializer = Xml.newSerializer();  
  53.                  StringWriter writer = new StringWriter();  
  54.                  try {  
  55.                     serializer.setOutput(writer);  
  56.                     serializer.startDocument("UTF-8",true);  
  57.                                                   
  58.                     for(int i=0;i<handler.getkeys().size();i++)  
  59.                     {  
  60.                        if(handler.GetKeys().get(i).equals("startTag"))  
  61.                        {  
  62.                           serializer.startTag("", (String) handler.GetValues().get(i));  
  63.                        }else if(handler.GetKeys().get(i).equals("Attr")){  
  64.                           String[] str= (String[]) handler.GetValues().get(i);  
  65.                           serializer.attribute("",str[0],str[1]);  
  66.                        }else if(handler.GetKeys().get(i).equals("text"))  
  67.                           serializer.text((String)handler.GetValues().get(i));  
  68.                        else if(handler.GetKeys().get(i).equals("endTag"))  
  69.                        {  
  70.                           serializer.endTag("", (String) handler.GetValues().get(i));  
  71.                        }  
  72.                     }  
  73.                     serializer.endDocument();  
  74.                     String text=writer.toString();  
  75.                     text=text.replace("><"">/r/n<");  
  76.                     memo.setText(text);//输出到文本框  
  77.                 } catch (Exception e) {  
  78.                     throw new RuntimeException(e);  
  79.                 }  
  80.                                           
  81.              } catch (Exception e) {}  
  82.          }  
  83.      }  
  84.    }  
  85. }  
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/course/446.html
2015年2月28日
发布:鸡啄米 分类:Android开发教程 浏览: 评论:0