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

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的结果如下:  


 b


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

  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.         <button android:layout_height="wrap_content" 
  5.                 android:layout_width="fill_parent" android:id="@+id/btnSAX"
  6.                 android:text="使用SAX解析XML">
  7.         <button android:layout_height="wrap_content" 
  8.                 android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput">
  9.         <edittext android:text="@+id/EditText01" android:id="@+id/EditText01" 
  10.                 android:layout_width="fill_parent" android:layout_height="fill_parent">


复制代码
SAXHandler.java的源码如下:
  1. SAXHandler.java的源码如下:
复制代码
testSAX.java的源码如下:
  1. package com.testSAX;

  2. import java.io.StringWriter;

  3. import javax.xml.parsers.SAXParser;
  4. import javax.xml.parsers.SAXParserFactory;

  5. import org.xml.sax.InputSource;
  6. import org.xml.sax.XMLReader;
  7. import org.xmlpull.v1.XmlSerializer;

  8. import android.app.Activity;
  9. import android.os.Bundle;

  10. import android.util.Xml;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;

  14. public class testSAX extends Activity {
  15.         /** Called when the activity is first created. */
  16.         Button btnSAX, btnOutput;
  17.         EditText memo;
  18.         SAXHandler handler = new SAXHandler();

  19.         
  20.         @Override
  21.         public void onCreate(Bundle savedInstanceState) {
  22.                 super.onCreate(savedInstanceState);
  23.                 setContentView(R.layout.main);
  24.                 btnSAX = (Button) this.findViewById(R.id.btnSAX);
  25.                 btnSAX.setOnClickListener(new ClickEvent());
  26.                 btnOutput = (Button) this.findViewById(R.id.btnOutput);
  27.                 btnOutput.setOnClickListener(new ClickEvent());
  28.                 memo = (EditText) this.findViewById(R.id.EditText01);

  29.         }

  30.         class ClickEvent implements View.OnClickListener {

  31.                 @Override
  32.                 public void onClick(View v) {
  33.                         if (v == btnSAX) {//解析XML,并保存标记,属性等值
  34.                                 try {
  35.                                         SAXParserFactory factory = SAXParserFactory.newInstance();
  36.                                         SAXParser parser = factory.newSAXParser();
  37.                                         XMLReader reader = parser.getXMLReader();
  38.                                         reader.setContentHandler(handler);
  39.                                         reader.parse(new InputSource(testSAX.this.getResources()
  40.                                                         .openRawResource(R.raw.test)));
  41.                                 } catch (Exception ee) {}
  42.                         }
  43.                         else if (v == btnOutput) {//生成XML
  44.                                 try {
  45.                                         XmlSerializer serializer = Xml.newSerializer();
  46.                                         StringWriter writer = new StringWriter();
  47.                                         try {
  48.                                                 serializer.setOutput(writer);
  49.                                                 serializer.startDocument("UTF-8",true);
  50.                                                 
  51.                                                 for(int i=0;i<handler.getkeys().size();i++)
  52.                                                 {
  53.                                                         if(handler.GetKeys().get(i).equals("startTag"))
  54.                                                         {
  55.                                                                 serializer.startTag("", (String) handler.GetValues().get(i));
  56.                                                         }
  57.                                                         else if(handler.GetKeys().get(i).equals("Attr")){
  58.                                                                 String[] str= (String[]) handler.GetValues().get(i);
  59.                                                                 serializer.attribute("",str[0],str[1]);
  60.                                                         }
  61.                                                         else if(handler.GetKeys().get(i).equals("text"))
  62.                                                                 serializer.text((String)handler.GetValues().get(i));
  63.                                                         else if(handler.GetKeys().get(i).equals("endTag"))
  64.                                                         {
  65.                                                                 serializer.endTag("", (String) handler.GetValues().get(i));
  66.                                                         }
  67.                                                 }
  68.                                                 serializer.endDocument();
  69.                                                 String text=writer.toString();
  70.                                                 text=text.replace("><", ">/r/n<");
  71.                                                 memo.setText(text);//输出到文本框
  72.                                         } catch (Exception e) {
  73.                                                 throw new RuntimeException(e);
  74.                                         }
  75.                                         
  76.                                 } catch (Exception e) {}
  77.                         }

  78.                 }

  79.         }
  80. }
复制代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值