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:
    [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简单些(个人认为)。
  • 相关阅读:
    jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例
    jwt 0.9.0(二)jwt官网资料总结
    jwt 0.9.0(一)推荐jwt理由
    jwt 0.9.0 系列目录
    Elasticsearch-6.7.0系列(八)开启kibana监控
    Elasticsearch-6.7.0系列(七)SpringCloud连接ES集群,使用ES用户名密码
    Elasticsearch-6.7.0系列(六)ES设置集群密码
    Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号
    nginx1.14.0版本location路径,多级文件目录配置,root与alias的配置区别
    docker18.09.5 Dockerfile文件编写
  • 原文地址:https://www.cnblogs.com/jasonxcj/p/4800518.html
Copyright © 2011-2022 走看看