android xml解析

android xml 解析

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。
 
SAX特点: 解析方式是一种基于事件驱动的,消耗的内存少
  
Pull特点: 解析方式是一种基于事件驱动的,消耗的内存少,在android系统内部的xml解析都是用这种方式
 
Dom特点: dom是把全部文件读入到内存中,这种方式很消耗内存,对于内存资源本来就很少的android手机,这种 方式不太建议使用。
 
个人建议:  SAX和pull都比较适合mobile,Dom适合服务器解析,随着mobile手机的内存增加,Dom也许可以使用。
 
SAX解析例子:
XML:
[html
<?xml version="1.0" encoding="utf-8"?>  
<users>  
<user name="admin0" age="26">root0</user>  
<user name="admin1" age="26">root1</user>  
<user name="admin2" age="26">root2</user>  
<user name="admin3" age="26">root3</user>  
</users>  
放在src/目录下
 
 
SAXHandler:
[java]  
package com.hualu.androidxml;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import org.xml.sax.Attributes;  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.DefaultHandler;  
  
public class SAXHandler extends DefaultHandler {  
  
    private List<User> users ;  
    User user ;  
    int i = 1 ;  
    @Override  
    public void startDocument() throws SAXException {  
        users = new ArrayList<User>() ;  
    }  
      
    @Override  
    public void endDocument() throws SAXException {  
        super.endDocument();  
    }  
      
    @Override  
    public void startElement(String uri, String localName, String qName,  
            Attributes attributes) throws SAXException {  
          
        if("user".equals(localName)){  
            i = 2 ;  
            user = new User() ;  
            user.setName(attributes.getValue("name")) ;  
            user.setAge(attributes.getValue("age")) ;  
        }  
          
    }  
      
    @Override  
    public void endElement(String uri, String localName, String qName)  
            throws SAXException {  
        if("user".equals(localName)){  
            users.add(user) ;  
        }  
    }  
      
    @Override  
    public void characters(char[] ch, int start, int length)  
            throws SAXException {  
        if(i == 2)  
            user.setPassword(String.valueOf(ch,start,length)) ;  
          
        i = 1 ;  
    }  
  
    public List<User> getUsers() {  
        return users ;  
          
    }  
      
}  
SAXClient:
[java]  
package com.hualu.androidxml;  
  
import java.io.InputStream;  
import java.util.List;  
  
import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.SAXParserFactory;  
  
import android.content.Context;  
  
public class SAXClient {  
  
    public void parserXML(Context context) {  
        try {  
            SAXParserFactory factory = SAXParserFactory.newInstance();  
            SAXParser parser = factory.newSAXParser();  
            SAXHandler handler = new SAXHandler() ;  
            InputStream file = SAXClient.class.getClassLoader().getResourceAsStream("user.xml");  
            parser.parse(file, handler) ;  
            List<User> users = handler.getUsers() ;  
            for(User user: users){  
                System.out.println(user.getName() + " ; " + user.getPassword() + "  ;  " + user.getAge());  
            }  
        } catch (Exception e) {  
        }  
  
    }  
}  
具体步骤:
1、实例化一个工厂SAXParserFactory
 
2、实例化SAXPraser对象,创建XMLReader 解析器
 
3、实例化Handler,处理器
 
4、注册解析器
 
4、读取文件流
 
5、解析文件
 
 
Pull解析例子:
XML:
[html] 
<?xml version="1.0" encoding="utf-8"?>  
<users>  
<user name="admin0" age="26">root0</user>  
<user name="admin1" age="26">root1</user>  
<user name="admin2" age="26">root2</user>  
<user name="admin3" age="26">root3</user>  
</users>  
放在res/xml目录下。
 
PullXMLParser:
[java]  
package com.hualu.androidxml;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import android.app.Activity;  
import android.content.res.XmlResourceParser;  
  
public class PullXMLParser {  
      
    private Activity activity ;  
      
    public PullXMLParser(Activity activity ){  
        this.activity  = activity;  
    }  
      
    public List<User> parser(){  
        List<User> users = new ArrayList<User>() ;  
        XmlResourceParser xrParser = activity.getResources().getXml(R.xml.user);  
        try{  
            while(xrParser.getEventType() != XmlResourceParser.END_DOCUMENT) {  
                if(xrParser.getEventType() == XmlResourceParser.START_TAG){  
                    String tagName = xrParser.getName() ;  
                    if("user".equals(tagName)){  
                        User user = new User() ;  
                        user.setName(xrParser.getAttributeValue(null, "name")) ;  
                        user.setAge(xrParser.getAttributeValue(null, "age")) ;  
                        user.setPassword(xrParser.getText()) ;  
                        users.add(user) ;  
                    }  
                }  
                xrParser.next() ;  
            };  
        }catch (Exception e) {  
        }  
        return users ;  
    }  
  
}  
具体步骤:
1. 通过Resource,取得XML文件数据,实例化一个 XmlResourceParser
2. 通过 XmlResourceParser的事件判断,解析XmL
 
这种方式比SAX简单些(个人认为)。

posted on 2015-09-11 11:53  Jasonxcj  阅读(164)  评论(0编辑  收藏  举报

导航