android xml的作用,Android提高之XML解析与生成实例详解

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

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

testSAX

hellogv

http://blog.csdn.net/hellogv

解析如上XML的结果如下图所示:

5d956fb901f41d0bff52b4b978cbd285.gif

使用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源码。

最终生成XML的结果如下图所示:

b31be6614e682c5ec411f488f6cbe421.gif

上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。

本文的main.xml代码如下:

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="fill_parent" android:id="@+id/btnSAX"

android:text="使用SAX解析XML">

android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput">

android:layout_width="fill_parent" android:layout_height="fill_parent">

SAXHandler.java的源码如下:

package com.testSAX;

import java.util.ArrayList;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class SAXHandler extends DefaultHandler{

private ArrayList keys = new ArrayList();//保存字段名称

private ArrayList values = new ArrayList();//保存值

@Override

public void startDocument() throws SAXException {

super.startDocument();

}

@Override

public void endDocument() throws SAXException {

super.endDocument();

}

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

//保存开始标记

keys.add("startTag");

values.add(localName);

Log.e("startTag",localName);

//保存属性值

for ( int i = 0; i < attributes.getLength(); i++ ){

keys.add("Attr");

String[] str=new String[2];

str[0]=attributes.getLocalName(i);

str[1]=attributes.getValue(i);

values.add(str);

Log.e("Attr",str[0]+"="+str[1]);

}

}

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

//保存结束标记

keys.add("endTag");

values.add(localName);

Log.e("endTag",localName);

}

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

String value = new String(ch, start, length);

value = value.trim();

if (value.length() == 0)

return;

keys.add("text");

values.add(value);

Log.e("text",value);

}

public ArrayList GetKeys()

{

return keys;

}

public ArrayList GetValues()

{

return values;

}

}

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

{

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) {}

}

}

}

}

感兴趣的读者可以自己动手调试运行一下本实例代码,希望能对大家的Android项目开发起到参考借鉴作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值