SAX解析

来源:互联网 发布:nginx安装lua模块 编辑:程序博客网 时间:2024/04/29 07:48
优点:
   不需要像dom解析那样在内存中建立一个dom对象,占用内存
   sax解析是逐行解析的,每次读入内存的只是一行xml,所以速度快,效率高点。不过sax一般是处理固定格式的xml。
 
xml:
 
<?xml version="1.0" encoding="UTF-8"?><persons><person id="11">        <name>heje</name>        <age>22</age>        </person><person id ="22">        <name>heje</name>        <age>22</age>        </person>    </persons>
 
 
 
对象模型:package com.example.zy;

import android.R.integer;

public class Person {  private Integer id; private String name; private Short age; public Person(){};  public Person(Integer id,String name,Short age){  this.id=id;  this.name=name;  this.age=age; };     public Person(String name,Short age){   this.name=name;   this.age=age;   }

  public Integer getId() {   return id;  }

  public void setId(Integer id) {   this.id = id;  }

  public String getName() {   return name;  }

  public void setName(String name) {   this.name = name;  }

  public Short getAge() {   return age;  }

  public void setAge(Short age) {   this.age = age;  }

  @Override  public String toString() {   // TODO Auto-generated method stub   return "id="+ id+ ",name="+ name+ ",age="+ age;  };         

}

 

 

处理事件源在解析过程中产生不同类的事件:

package com.example.zy;

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

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

import android.R.integer;

public class SAX_handler extends DefaultHandler {

 private static final String TAG = "SAX_handler"; private List<Person> persons; private String perTag;// 记录前一个标签

 Person person;// 记录当前标签

 public List<Person> getPersons() {  return persons;

 }

 @Override public void characters(char[] ch, int start, int length)   throws SAXException {  String data = new String(ch, start, length).trim();  if (!"".equals(data.trim())) {  }  if ("name".equals(perTag)) {   person.setName(data);  } else if ("age".equals(perTag)) {   person.setAge(new Short(data));  }

 }

 @Override public void endDocument() throws SAXException {

 }

 @Override public void endElement(String uri, String localName, String qName)   throws SAXException {  if ("person".equals(localName)) {   persons.add(person);   person = null;  }  perTag = null;

 }

 // 初始化 @Override public void startDocument() throws SAXException {  persons = new ArrayList<Person>(); }

 @Override public void startElement(String uri, String localName, String qName,   Attributes attributes) throws SAXException {  if ("person".equals(localName)) {   for (int i = 0; i < attributes.getLength(); i++) {    person = new Person();    person.setId(Integer.valueOf(attributes.getValue(i)));   }

  }

  perTag = localName;

 }

}

 

 

 

 

 
 
 
activity:
 

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

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

import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;

import android.os.Bundle;import android.app.Activity;import android.widget.TextView;

public class MainActivity extends Activity {

 @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);

  TextView text = (TextView) findViewById(R.id.textaction);  try {   // 创建一个工厂对象   SAXParserFactory factory = SAXParserFactory.newInstance();   // 通过工厂对象得到一个解析器对象   SAXParser parser = factory.newSAXParser();   // 通过parser得到XMLReader对象   XMLReader reader = parser.getXMLReader();   // 为reader对象注册事件处理接口   SAX_handler handler = new SAX_handler();   reader.setContentHandler(handler);   // 解析指定XML字符串对象   reader.parse(new InputSource(MainActivity.class.getClassLoader()     .getResourceAsStream("wang.xml")));   List<Person> persons = handler.getPersons();   String usersInfo = "";   for (Person person : persons) {    usersInfo += "ID->" + person.getId() + "\n";    usersInfo += "NAME->" + person.getName() + "\n";    usersInfo += "AGE->" + person.getAge() + "\n";    usersInfo += "\n\n";

   }   text.setText(usersInfo);

  } catch (ParserConfigurationException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (SAXException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }

 }

}

 

 

 
原创粉丝点击