zoukankan      html  css  js  c++  java
  • 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:
    <?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:
    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:
    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:
    <?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:
    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简单些(个人认为)。








  • 相关阅读:
    Mac下的类似apt-get的包管理工具Homebrew(笔记)
    C# 通过模拟http请求来调用soap、wsdl
    提高 ASP.NET Web 应用性能
    Ajax ContentType 列表大全
    关于多核游览器指定渲染内核的方法。
    Aspx页面模拟WebService功能
    Dapper完美兼容Oracle,执行存储过程,并返回结果集。
    简单爬虫,突破IP访问限制和复杂验证码,小总结
    在子线程中创建新的窗体,遇到的问题。
    【干货】jsMind思维导图整合Easyui的右键菜单
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207263.html
Copyright © 2011-2022 走看看