android sax解析



一、源码目录结构:


二、待解析文件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>();//保存值 @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<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(); @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(SAXParaserTestActivity.this.getResources() .openRawResource(R.raw.test))); } catch (Exception ee) { ee.printStackTrace(); } } 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) { 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一样将文档树长期留驻在内存,数据不是长久的。事件过后,若没保存数据,那么数据就会丢失。

使用场合:机器有性能限制,尤其是在嵌入式环境。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值