XML解析之SAX解析

来源:互联网 发布:windows redmine 迁移 编辑:程序博客网 时间:2024/05/22 01:30

1.SAX是一种解析速度快且占用内存少的一种XML解析器。SAX解析XML文件采用的是事件驱动。所谓事件就是一些回调方法,这些方法定义在ContentHandler接口中。

2.接下来看下ContentHandler接口中的几个方法:

*startDocunment():当遇到文档的开头的时候触发此事件,做一些预处理工作。

*endDocument():当文档结束的时候触发此事件,做一些后续的处理工作。

*startElement(String namespaceURI,String localName,String qName,Attributes atts):当遇到开始标签的时候触发此事件。namespaceURI就是命名空间,localName就是不带命名空间前缀的标签名,qName就是带命名空间前缀的标签名,可以通过atts获得所有的属性名和属性值。

endElement(String uri,String localName,String name):当遇到标签结尾的时候触发此方法。

character(char[] ch,int start,int length):当遇到xml文档内容的时候触发此事件。

3.接下来看一个简单的SAX解析XML的Demo:

首先看下Demo项目结构:

看下我们需要解析的这个itcast.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?><persons>    <person id="1">        <name>张三</name>        <age>18</age>    </person>    <person id="2">        <name>李四</name>        <age>19</age>    </person></persons>

定义的Person类的内容:

package com.android.douf;//定义person类public class Person{    @Override    public String toString()    {        return super.toString();    }    private String name;    private int age;    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    public int getAge()    {        return age;    }    public void setAge(int age)    {        this.age = age;    }}

定义一个类继承DefaultHandler类,实现其解析方法:

package com.android.douf;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.util.Log;//继承DefaultHandler类,实现其解析方法public class XMLContentHandler extends DefaultHandler{    private static final String TAG = "XMLContentHandler";    private List<Person> persons;    private Person person;    private String tag = null;       public List<Person> getPersons()    {        return persons;    }    @Override    public void startDocument() throws SAXException    {        persons = new ArrayList<Person>();        Log.i(TAG, "开始解析");    }      @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException    {        if ("person".equals(localName))        {            person = new Person();        }        tag = localName;    }    @Override    public void characters(char[] ch, int start, int length)            throws SAXException    {        String data = new String(ch, start, length);        if (tag!=null)        {            if ("name".equals(tag))            {                person.setName(data);            }            if ("age".equals(tag))            {                person.setAge(Integer.parseInt(data));            }        }        Log.i(tag, "解析内容"+data);    }    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException    {        if ("person".equals(localName)&&person!=null)        {            persons.add(person);        }        tag = null;    }    @Override    public void endDocument() throws SAXException    {        Log.i(tag, "解析结束");    }  }

SAX_Service类,创建解析工厂获取解析器进行解析:

package com.android.douf;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class SAX_Service{    public List<Person> readXML(InputStream is) throws Exception{        //创建解析工厂        SAXParserFactory spf = SAXParserFactory.newInstance();        //获取解析器        SAXParser sp = spf.newSAXParser();        XMLContentHandler handler = new XMLContentHandler();        //进行解析        sp.parse(is, handler);        is.close();        return handler.getPersons();     }}

其次是Activity类内容:

package com.android.douf;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SAX_XMLActivity extends Activity {        private Button button;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        button = (Button) findViewById(R.id.button);        button.setOnClickListener(new OnClickListener()        {             @Override            public void onClick(View v)            {                //获取系统中药解析的xml文件,加入到输入流中                InputStream is = SAX_XMLActivity.class.getClassLoader().getResourceAsStream("itcast.xml");                List<Person> persons = new ArrayList<Person>();                try                {                    SAX_Service sax_service = new SAX_Service();                    //将输入流中的内容进行解析                    persons = sax_service.readXML(is);                                        String name = persons.get(0).getName();                    int age = persons.get(0).getAge();                    String name_ = persons.get(1).getName();                    int age_ = persons.get(1).getAge();                    System.out.println("name:"+name+"\t"+"age"+age+"\n"+"name_:"+name_+"\t"+"age_:"+age_);                }                catch (Exception e)                {                    e.printStackTrace();                }            }        });    }}

运行结果显示如下:

以上就实现了一个简单的SAX解析。