欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

21天学习android开发教程之XML解析与生成

程序员文章站 2024-02-22 22:39:58
本文使用sax来解析xml,在android里面可以使用sax和dom,dom需要把整个xml文件读入内存再解析,比较消耗内存,而sax基于事件驱动的处理方式,可以在各节点...

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

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

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

 saxparserfactory factory = saxparserfactory.newinstance();
                    saxparser parser = factory.newsaxparser();
                    xmlreader reader = parser.getxmlreader();
                    reader.setcontenthandler(handler);
                    reader.parse(new inputsource(testsax.this.getresources()
                            .openrawresource(r.raw.test)));

在这段代码里,xmlreader就调用继承defaulthandler的saxhandler。defaulthandler已实现contenthandler, dtdhandler, entityresolver, errorhandler等接口,包含常见读取xml的操作,具体请看下面的saxhandler.java源码。
读取各节点之后,使用xmlserializer重新组合并输出xml字符串。本文的main.xml代码如下:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <button android:layout_height="wrap_content" 
        android:layout_width="fill_parent" android:id="@+id/btnsax"
        android:text="使用sax解析xml">
    <button android:layout_height="wrap_content" 
        android:layout_width="fill_parent" android:text="生成xml" android:id="@+id/btnoutput">
    <edittext android:text="@+id/edittext01" android:id="@+id/edittext01" 
        android:layout_width="fill_parent" android:layout_height="fill_parent">

testsax.java的源码如下:

package com.testsax;

import java.io.stringwriter;

import javax.xml.parsers.saxparser;
import javax.xml.parsers.saxparserfactory;

import org.xml.sax.inputsource;
import org.xml.sax.xmlreader;
import org.xmlpull.v1.xmlserializer;

import android.app.activity;
import android.os.bundle;

import android.util.xml;
import android.view.view;
import android.widget.button;
import android.widget.edittext;

public class testsax extends activity {
    /** called when the activity is first created. */
    button btnsax, btnoutput;
    edittext memo;
    saxhandler handler = new saxhandler();

    
    @override
    public void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.main);
        btnsax = (button) this.findviewbyid(r.id.btnsax);
        btnsax.setonclicklistener(new clickevent());
        btnoutput = (button) this.findviewbyid(r.id.btnoutput);
        btnoutput.setonclicklistener(new clickevent());
        memo = (edittext) this.findviewbyid(r.id.edittext01);

    }

    class clickevent implements view.onclicklistener {

        @override
        public void onclick(view v) {
            if (v == btnsax) {//解析xml,并保存标记,属性等值
                try {
                    saxparserfactory factory = saxparserfactory.newinstance();
                    saxparser parser = factory.newsaxparser();
                    xmlreader reader = parser.getxmlreader();
                    reader.setcontenthandler(handler);
                    reader.parse(new inputsource(testsax.this.getresources()
                            .openrawresource(r.raw.test)));
                } catch (exception ee) {}
            }
            else if (v == btnoutput) {//生成xml
                try {
                    xmlserializer serializer = xml.newserializer();
                    stringwriter writer = new stringwriter();
                    try {
                        serializer.setoutput(writer);
                        serializer.startdocument("utf-8",true);
                        
                        for(int i=0;i<handler.getkeys().size();i++)
                        {
                            if(handler.getkeys().get(i).equals("starttag"))
                            {
                                serializer.starttag("", (string) handler.getvalues().get(i));
                            }
                            else if(handler.getkeys().get(i).equals("attr")){
                                string[] str= (string[]) handler.getvalues().get(i);
                                serializer.attribute("",str[0],str[1]);
                            }
                            else if(handler.getkeys().get(i).equals("text"))
                                serializer.text((string)handler.getvalues().get(i));
                            else if(handler.getkeys().get(i).equals("endtag"))
                            {
                                serializer.endtag("", (string) handler.getvalues().get(i));
                            }
                        }
                        serializer.enddocument();
                        string text=writer.tostring();
                        text=text.replace("><", ">/r/n<");
                        memo.settext(text);//输出到文本框
                    } catch (exception e) {
                        throw new runtimeexception(e);
                    }
                    
                } catch (exception e) {}
            }

        }

    }
}

 以上就是本文的全部内容,希望对大家的学习有所帮助。