Welcome 微信登录

首页 / 移动开发 / Android / 21天学习android开发教程之XML解析与生成

本文使用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();@Overridepublic 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 {@Overridepublic 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) {//生成XMLtry {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) {}}}}}
 以上就是本文的全部内容,希望对大家的学习有所帮助。