android中sax解析xml 操作介绍

来源:互联网 发布:人工智能百度百科 编辑:程序博客网 时间:2024/05/22 13:40

step1 编写bean

package com.activity;

public class LinkMan {
private String name;
private String email;
private String linkman;
public String getLinkman() {
 return linkman;
}
public void setLinkman(String linkman) {
 this.linkman = linkman;
}
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public String getEmail() {
 return email;
}
public void setEmail(String email) {
 this.email = email;
}

}

 

step2 继承DefaultHandler实现一个sax事件解析器

 

package com.activity;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 创建sax解析器
 *
 * @author Administrator
 *
 */
public class MySax extends DefaultHandler {
 private List<LinkMan> all = null;// 保存多条数据

 private LinkMan man = null;
 private String elementName = null;// 保存节点的名称

 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  if (this.elementName != null) {// 已经取得元素名称
   String data = new String(ch, start, length);
   if ("name".equals(this.elementName)) {
    this.man.setName(data);
   } else if ("email".equals(this.elementName)) {
    this.man.setEmail(data);
   }
  }

 }

 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  if ("linkman".equals(localName)) {
   this.all.add(this.man);
   this.man = null;// 准备保存下次的数据
  }
  this.elementName = null;// 把元素名称清空
 }

 @Override
 public void startDocument() throws SAXException {
  this.all = new ArrayList<LinkMan>();// 开始解析文档,所以要设置集合
 }

 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  // TODO Auto-generated method stub
  if ("linkman".equals(localName)) {// 是linkman节点
   this.man = new LinkMan();
  }
  this.elementName=localName;
 }
 public List<LinkMan> getAll() {
  return all;
 }

 public void setAll(List<LinkMan> all) {
  this.all = all;
 }
}

step3 在activity中创建操作sax

package com.activity;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

/**
 * sax操作
 *
 * @author Administrator
 *
 */
public class DOMProjectActivity extends Activity {
 /** Called when the activity is first created. */
 private TextView nameView = null;
 private TextView emailView = null;
 private Button but = null;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  this.nameView = (TextView) findViewById(R.id.name);
  this.emailView = (TextView) findViewById(R.id.email);
  this.but = (Button) findViewById(R.id.but);
  this.but.setOnClickListener(new OnClickListenerImpl());
 }

 private class OnClickListenerImpl implements OnClickListener {

  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   if (!Environment.getExternalStorageState().equals(
     Environment.MEDIA_MOUNTED)) {// sdcard不存在
    return;// 返回程序被调用处
   }
   File file = new File(Environment.getExternalStorageDirectory()
     + File.separator + "mldndata" + File.separator + "mldn.xml");// 要输出文件的路径
   if (!file.exists()) {// 父路径不存在
    return;

   }
   SAXParserFactory factory = SAXParserFactory.newInstance();
   SAXParser parser = null;
   MySax sax = new MySax();
   try {
    parser = factory.newSAXParser();
   } catch (ParserConfigurationException e) {
    e.printStackTrace();
   } catch (SAXException e) {
    e.printStackTrace();
   }
   try {
    parser.parse(file, sax);
   } catch (SAXException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
   List<LinkMan> all = sax.getAll();
   DOMProjectActivity.this.nameView.setText(all.get(0).getName());
   DOMProjectActivity.this.emailView.setText(all.get(0).getEmail());
  }
 }
}

 
  sax与dom操作的区别在于dom操作中所有内容一次性全部读取进来。比较消耗内存。