首页 > 系统 > Android > 正文

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

2020-04-11 10:50:30
字体:
来源:转载
供稿:网友

本文使用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) {}            }        }    }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表