android-XML解析Dom,Sax,Pull

本文介绍了Android平台上解析XML的三种常见方法:DOM、SAX、PULL,并提供了相应的实现代码。通过示例展示了如何使用这三种方式解析XML文件,包括DOM方式的效率考量、SAX方式的事件驱动解析和PULL方式的数字回调解析。文章还实现了XML文件的处理和显示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android平台上解析xml的常见的工具有三种:dom,sax,pull。
第一种是DOM,
它的特点是一次全部加载,如果对于数据量小的情况下,它的效率还可以,如果XML文件很大的情况下,速度就会慢起来。
第二种方式SAX:
SAX是基于事件驱动的。当然android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。
第三种方式PULL:
这种方式也是基于事件驱动 的,与SAX方式一样,只不过PULL方式读xml回调方法返回的是数字。
下面分别使用它们解析xml文件。
在assert下放置persons.xml文件:

<?xml version="1.0" encoding="utf-8"?>  
<persons>  
    <person id="1">  
        <name>张三</name>  
        <age>12</age>     
    </person>  
    <person id="2">  
        <name>李四</name>  
        <age>14</age>     
    </person>  
    <person id="3">  
        <name>王五</name>  
        <age>15</age>     
    </person>  
</persons>  

创建Activity文件准备处理文件并显示:

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class XMLActivity extends Activity implements  OnClickListener{
    /** Called when the activity is first created. */
    private Button  btn_dom;
    private Button  btn_sax;
    private Button  btn_pull;
    private  ListView listview;
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
private void init(){
	btn_dom=(Button) findViewById(R.id.dom);
	btn_sax=(Button) findViewById(R.id.sax);
	btn_pull =(Button) findViewById(R.id.pull);
	listview  =(ListView) findViewById(R.id.list);
	btn_dom.setOnClickListener(this);
	btn_sax.setOnClickListener(this);
	btn_pull.setOnClickListener(this);
}
	public void onClick(View v) {
		// TODO Auto-generated method stub
		int id = v.getId();  
        List<Person> list = null;  
        InputStream is = null;  
        AssetManager manager = getAssets();  
        try  
        {   //读取xml文件。
            is = manager.open("persons.xml");  
        } catch (IOException e)  
        {  
            e.printStackTrace();  
        }  
        switch (id)  
        {  
        case R.id.dom:  //使用dom解析
            try  
            {  
                list = new DomParseService().getPersonsByParseXml(is);  
                showUI(list);  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
            break;  
        case R.id.sax:  //使用sax解析
            try  
            {  
                list = new SAXParseService().getPersonsByParseXml(is);  
                showUI(list);  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
            break;  
        case R.id.pull:  //使用pull解析
            try  
            {  
                list = new PullParseService().getPersonsByParseXml(is);  
                showUI(list);  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
            break;  
        default:  
            break;  
        }  
        try  
        {  
  
            is.close();  
        } catch (IOException e)  
        {  
            // TODO Auto-generated catch block   
            e.printStackTrace();  
        }  
	}
	 public void showUI(List<Person> list)  
	    {  
	        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();  
	        for (Person p : list)  
	        {  
	            Map<String, Object> map = new HashMap<String, Object>();  
	            map.put("id", p.getId());  
	            map.put("name", p.getName());  
	            map.put("age", p.getAge());  
	            data.add(map);  
	        }  
	        String[] from =  
	        { "id", "name", "age" };  
	        int[] to =  
	        { R.id.tv_id, R.id.tv_name, R.id.tv_age };  
	        SimpleAdapter adapter = new SimpleAdapter(this, data,  
	                R.layout.person_list_item, from, to);  
	       listview.setAdapter(adapter);
	    }  
}


创建解析xml文件的接口:


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

public interface IXmlParseService {

	 public List<Person> getPersonsByParseXml(InputStream is) throws Exception;  
}

dom解析:

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.util.Log;

public class DomParseService implements IXmlParseService {

	public List<Person> getPersonsByParseXml(InputStream is) throws Exception {
		// TODO Auto-generated method stub
		List<Person> list = null;
		DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder build  =factory.newDocumentBuilder();
		Document  document = build.parse(is);
		Element rootElement  = document.getDocumentElement();
		NodeList  nodeList = rootElement.getElementsByTagName("person");
		if(nodeList==null||nodeList.getLength()==0)
		{
			return null;
		}
		list = new ArrayList<Person>();
		for(int i=0;i<nodeList.getLength();i++)
		{
			Person  person = new Person();
			Element  element = (Element) nodeList.item(i);
			  // 得到根节点属性:id  
			int id = Integer.parseInt(element.getAttribute("id"));
			person.setId(id);
			/*得到子节点*/
			NodeList childnodes = element.getChildNodes();			
			for(int j=0; j<childnodes.getLength(); j++ ){				
				Node childNode = (Node)childnodes.item(j);
				
				if(childNode.getNodeType() == Node.ELEMENT_NODE){
					Element childElement = (Element)childNode;
					if("name".equals(childElement.getNodeName())){
						person.setName(childElement.getFirstChild().getNodeValue());
					}
					else if("age".equals(childElement.getNodeName())){
						person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
					}
				}
			}
			list.add(person);	
		}
		
		return list;
	}

}

sax解析:

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

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

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

import android.os.Handler;
import android.util.Log;

public class SAXParseService implements IXmlParseService {

	public List<Person> getPersonsByParseXml(InputStream is) throws Exception {
		// TODO Auto-generated method stub
		SAXParserFactory  factory = SAXParserFactory.newInstance();
		SAXParser   parser  =factory.newSAXParser();
		MyHandler  handler  = new MyHandler();
		parser.parse(is,handler);
		return  handler.getList();
	}
 private  class  MyHandler  extends  DefaultHandler
 {
	 private  List<Person>  list;
	 private  Person  person;
	 private  String  currentTag;
	 private  List<Person>  getList()
	 {
		 return list;
	 }
	 @Override  
     public void startDocument() throws SAXException  
     {  
         list = new ArrayList<Person>();  
     }  

     @Override  
     public void endDocument() throws SAXException  
     {  
         super.endDocument();  
     }  

     @Override  
     public void startElement(String uri, String localName, String qName,  
             Attributes attributes) throws SAXException  
     { 
        
    	if("person".equals(qName))
    	{
    		person  =new Person();
    		person.setId(Integer.parseInt(attributes.getValue("id")));
    	}else  if("name".equals(qName)||"age".equals(qName)){
    		
    		currentTag  =qName;
    	}
    	 
     }
     @Override  
     public void characters(char[] ch, int start, int length)  
             throws SAXException  
     { 
    	 super.characters(ch, start, length);
    	 String s  =new String(ch,start,length);
    	 if("name".equals(currentTag))
    	 {
    		 person.setName(s);
    	 }else  if("age".equals(currentTag))
    	 {
    		 person.setAge(Integer.parseInt(s));
    	 }
    	 currentTag  =null;
     }
     @Override  
     public void endElement(String uri, String localName, String qName)  
     {  
    	 if("person".equals(qName))
    	 {
    		 list.add(person);
    		 person  = null;
    	 }
     }
 }
}

pull解析:

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

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class PullParseService implements IXmlParseService {

	public List<Person> getPersonsByParseXml(InputStream is) throws Exception {
		// TODO Auto-generated method stub
		List<Person> persons=null;  
        Person person=null;  
        XmlPullParser parser=Xml.newPullParser();  
        parser.setInput(is, "UTF-8");  
        int event=parser.getEventType();  
        while(event!= XmlPullParser.END_DOCUMENT){  
              
            switch(event){  
            case XmlPullParser.START_DOCUMENT:  
                persons=new ArrayList<Person>();  
                break;  
            case XmlPullParser.START_TAG:  
                if("person".equals(parser.getName())){  
                      
                    Integer personId=new Integer(parser.getAttributeValue(0));  
                    person=new Person();  
                    person.setId(personId);  
                }else if("name".equals(parser.getName())){  
                    String personName=parser.nextText();  
                    person.setName(personName);  
                }else if("age".equals(parser.getName()))  
                      
                    person.setAge(new Short(parser.nextText()));  
                  
                break;  
            case XmlPullParser.END_TAG:   
                if("person".equals(parser.getName())){  
                    persons.add(person);  
                    person=null;  
              
                }  
                break;    
            }  
  
            event=parser.next();  
      
        }  
          
        return persons;  
	}

}

运行效果如下:



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值