android sax解析
来源:互联网 发布:金域名人大酒店 编辑:程序博客网 时间:2024/06/07 03:33
一、源码目录结构:
二、待解析文件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>
三、布局文件main.xml
<?xml version="1.0" encoding="utf-8"?><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="@string/saxparxml"></Button><Button android:layout_height="wrap_content"android:layout_width="fill_parent" android:text="@string/generatexml"
android:id="@+id/btnOutput"></Button><EditText android:text="@+id/EditText01" android:id="@+id/EditText01"android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>
四、自定义DefaultHandler ->SAXHandler
package com.qiao.saxtest;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<String> keys = new ArrayList<String>();//保存字段名称 private ArrayList<Object> values = new ArrayList<Object>();//保存值@Overridepublic void startDocument() throws SAXException {super.startDocument();}@Overridepublic void endDocument() throws SAXException {super.endDocument();}@Overridepublic 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]);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//保存结束标记keys.add("endTag");values.add(localName);Log.e("endTag",localName);}@Overridepublic 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<String> GetKeys(){return keys;}public ArrayList<Object> GetValues(){return values;}}
五、Activity
package com.qiao.saxtest;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 SAXParaserTestActivity extends Activity {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(SAXParaserTestActivity.this.getResources().openRawResource(R.raw.test)));} catch (Exception ee) {ee.printStackTrace();}}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) {e.printStackTrace();}}}}}
六、解析打印结果(从这儿可以看出解析顺序,对SAXHandler的整体解析顺序有一个理解)
这个例子到这儿结束。
废话几句:
/*SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。 startElement(String namespaceURI, String localName, String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。endElement(String uri, String localName, String name)这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。characters(char[] ch, int start, int length) 这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。*/
SAX解析的优缺点:
优点:不用事先调入整个文档,占用资源少。尤其在嵌入式环境,如Android,极力推荐采用SAX进行解析。
缺点:不像DOM一样将文档树长期留驻在内存,数据不是长久的。事件过后,若没保存数据,那么数据就会丢失。
使用场合:机器有性能限制,尤其是在嵌入式环境。
- android SAX解析XML
- Android SAX解析实例教程
- android sax解析
- Android SAX解析XML
- android SAX解析XML
- Android sax 解析关键
- android xml-----Sax解析
- Android SAX解析XML
- Android SAX解析XML
- Android SAX解析XML
- Android SAX解析XML
- Android SAX 解析 XML
- Android SAX 解析
- Android SAX解析XML
- Android Sax解析xml
- android SAX解析XML
- android xml解析 sax
- android sax解析
- 出现bad interpreter:No such file or directory的原因
- java 驱动调度 电梯调度算法
- winform 打包自动安装数据库
- 最近一个项目用到PostgresSQl数据库,有些不同于oracle数据库,尤其时间处理上,结合PostgreSQL手册以及网上转载些资料,如下,方便开发中用到
- python UnicodeEncodeError: 'ascii' codec can't encode characters 解决办法
- android sax解析
- 八扇屏-北展
- Android ActionBar Tabs学习笔记
- ONE- Open Navigator Engine 开放式浏览器引擎
- 在 列表控件 中插入 进度条 SDK
- flex 返回值大于或等于其本身的最接近值
- LDTP(Linux Desktop Test Project)摘要
- Flex 文本框无法输入中文的bug
- .net GetCallbackEventReference参数说明和详细使用