21天学习android开发教程之XML解析与生成
程序员文章站
2024-02-18 12:11:22
本文使用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) {} } } } }
以上就是本文的全部内容,希望对大家的学习有所帮助。
上一篇: JSP中何获取properties中的值