zoukankan      html  css  js  c++  java
  • 安卓中使用XmlPullParser解析xml文件

    1、基本原理:
    常用的有:
    XmlPullParser.END_DOCUMENT
    XmlPullParser.START_DOCUMENT
    XmlPullParser.START_TAG
    XmlPullParser.END_TAG
    XmlPullParser.TEXT 
    分别代表着XML文档的结束,开始,标签的开始,标签的结束,内容 

    按照以上的格式依次进行解析即可。

    2、介绍了三种不同的xml格式及解析方法

    新建一个新的activiy文件,其实就是程序启动发源地而已。

    <span style="font-size: 18px;">public class MainActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);       
            xmltest xl = new xmltest();
            xl.test(getResources());
        }
       }</span>
    

    为了便于xml解析内容的存取,新建了一个Person.java类,内容如下:

    package com.test.xmlactivity;
    class Person{
        private int id = -1;
        private int age = 0;
        private String name = null;
        private String title = null;
                                                                                                                                        
        public Person(){
            //TODO
        }
                                                                                                                                        
        public Person(int _id,int _age,String _name,String _title){
            this.id = _id ;
            this.age = _id;
            this.name = _name;
            this.title = _title;
        }
                                                                                                                                        
        public void setID(int id){
            this.id = id;
        }
                                                                                                                                        
        public int getID(){
            return this.id;
        }
                                                                                                                                        
        public void setAge(int age){
            this.age = age;
        }
                                                                                                                                        
        public int getAge(){
            return this.age;
        }
                                                                                                                                        
        public void setName(String name){
            this.name = name;
        }
                                                                                                                                        
        public String getName(){
            return this.name;
        }
                                                                                                                                        
        public void setTitle(String title){
            this.title = title;
        }
                                                                                                                                        
        public String getTitle(){
            return this.title;
        }
    };
    View Code

    为方便其它程序简洁使用xml的读取及解析,封装了一个xmlReader.java类,内容如下:

    package com.test.xmlactivity;
    import java.io.IOException;
    import java.io.StringReader;
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlPullParserFactory;
    import android.util.Log;
    class XmlReader{
        private final static String TAG = "XmlReader";
        private XmlPullParser xmlparser = null;
        public static final String charset = "utf-8";
                                                                                       
        public XmlReader(){
            try {
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                xmlparser = factory.newPullParser();
            } catch (Exception e) {
                e.printStackTrace();
                Log.e(TAG,"create xml reader failed");
            }
        }
        public void setXML(String xml) throws IOException{
            try {
                xmlparser.setInput(new StringReader(xml));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
                                                                                           
        public int getNextEvent() throws IOException {
            try {
                return xmlparser.next();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return -1;
        }
                                                                                       
        public String getNextText() throws IOException{
            try {
                return xmlparser.nextText();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
                                                                                       
        public int getEventType() throws IOException {
            try {
                return xmlparser.getEventType();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return -1;
        }
                                                                                       
        public String getName() {
            return xmlparser.getName();
        }
                                                                                       
        public String getText() {
            return xmlparser.getText();
        }  
                                                                                       
        public int attributeCount() {
            return xmlparser.getAttributeCount();
        }
        public String getAttributeName(int i) {
            return xmlparser.getAttributeName(i);
        }
        public String getAttributeValue(String name) {
            String v = xmlparser.getAttributeValue(null, name);
            return v;
        }
                                                                                       
        public int getDepth() {
            return xmlparser.getDepth();
        }
    };
    View Code

    需要读取的xml资源文件放在 res\xm;\person.xml,其具体内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <White-collars>
        <employee id="1">
            <name>tom</name>
            <age>25</age>
            <title>engineer</title>
        </employee>
        <employee  id="2">
            <name>kite</name>
            <age>21</age>
            <title>tester</title>
        </employee>
        <employee id="3">
            <name>rose</name>
            <age>28</age>
            <title>manager</title>
        </employee>
    </White-collars>
    View Code

    a、从资源文件中读取
    需要使用系统资源,必须有Context对象,而Activity可以持有,所以需要在测试前将其资源句柄传入
    xl.test(getResources());
    而在具体的类中记录下来即可使用
    private XmlReader XR = null;
    private ArrayList<Person> mperlist = new ArrayList<Person>();
    private Resources mRes = null;

    public void test(Resources _res){
    this.mRes = _res;
    xml_test_main();
    }

    下面说明一下具体的xml内容解析:

    /* 1、使用文件测试 */
       private void xml_file_test(){
           int eventType = -1;
           Person ps = null;  
           XmlResourceParser xrp = mRes.getXml(R.xml.personal);       
                                                                       
           try {
               eventType = xrp.getEventType();
               while (eventType != XmlPullParser.END_DOCUMENT) {
                   switch (eventType) {
                   case XmlPullParser.START_DOCUMENT:
                       break;
                   case XmlPullParser.END_DOCUMENT:
                       break;
                   case XmlPullParser.START_TAG: {
                       String tagName = xrp.getName();
                       if (tagName != null && tagName.equals("employee")) {
                           ps = new Person();
                           int id = Integer.parseInt(xrp.getAttributeValue(null, "id"));
                           ps.setID(id);
                       }
                       if (tagName != null && tagName.equals("name")) {
                           String name;
                           try {
                               name = xrp.nextText();;
                               ps.setName(name);
                           } catch (IOException e) {
                               e.printStackTrace();
                           }
                       }
                       if (tagName != null && tagName.equals("title")) {
                           String title;
                           try {
                               title = xrp.nextText();
                               ps.setTitle(title);
                           } catch (IOException e) {
                               e.printStackTrace();
                           }
                       }
                       if (tagName != null && tagName.equals("age")) {
                           String age;
                           try {
                               age = xrp.nextText();
                               ps.setAge(Integer.parseInt(age));
                           } catch (IOException e) {
                               e.printStackTrace();
                           }
                       }
                   }
                       break;
                   case XmlPullParser.END_TAG: {
                       if (xrp.getName().equals("employee")) {
                           mperlist.add(ps);
                       }
                   }
                       break;
                   case XmlPullParser.TEXT:
                       break;
                   default:
                       break;
                   }
                   eventType = xrp.next();
               }
           } catch (Exception e) {
               // TODO: handle exception
           }
                                                                       
           for(int i=0;i<mperlist.size();i++){
               Log.i(TAG,"person info ====");
               Log.i(TAG,"ID = " + mperlist.get(i).getID());  
               Log.i(TAG,"name = "+ mperlist.get(i).getName());
               Log.i(TAG,"age = " + mperlist.get(i).getAge());
               Log.i(TAG,"title = " + mperlist.get(i).getTitle());
           }
       }
    View Code

    相应的打印内容:
    10-02 10:47:50.725: I/xmltest(12364): person info ====
    10-02 10:47:51.094: I/xmltest(12364): ID = 1
    10-02 10:47:51.382: I/xmltest(12364): name = tom
    10-02 10:47:51.647: I/xmltest(12364): age = 25
    10-02 10:47:51.986: I/xmltest(12364): title = engineer
    10-02 10:48:03.057: I/xmltest(12364): person info ====
    10-02 10:48:03.057: I/xmltest(12364): ID = 2
    10-02 10:48:03.057: I/xmltest(12364): name = kite
    10-02 10:48:03.057: I/xmltest(12364): age = 21
    10-02 10:48:03.057: I/xmltest(12364): title = tester
    10-02 10:48:05.038: I/xmltest(12364): person info ====
    10-02 10:48:05.038: I/xmltest(12364): ID = 3
    10-02 10:48:05.038: I/xmltest(12364): name = rose
    10-02 10:48:05.038: I/xmltest(12364): age = 28
    10-02 10:48:05.038: I/xmltest(12364): title = manager

    b、直接从内存中读取

    /* 直接使用内存测试 */
        private void xml_memory_test(){
            String xml_test = "<foo>Hello World!</foo>";
            try {
                XR.setXML(xml_test);
                int eventType = XR.getEventType();
                Log.i(TAG,"eventType: " + eventType);
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_DOCUMENT) {
                        Log.i(TAG,"Start document");
                    } else if (eventType == XmlPullParser.START_TAG) {
                        Log.i(TAG,"Start tag " + XR.getName());
                    } else if (eventType == XmlPullParser.END_TAG) {
                        Log.i(TAG,"End tag " + XR.getName());
                    } else if (eventType == XmlPullParser.TEXT) {
                        Log.i(TAG,"Text " + XR.getText());
                    }
                    eventType = XR.getNextEvent();
                    Log.i(TAG,"eventType: " + eventType);
                }
                Log.i(TAG,"End document");         
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ;
        }
    View Code

    输出内容:
    10-02 10:48:07.975: I/xmltest(12364): eventType: 0
    10-02 10:48:07.975: I/xmltest(12364): Start document
    10-02 10:48:07.983: I/xmltest(12364): eventType: 2
    10-02 10:48:07.983: I/xmltest(12364): Start tag foo
    10-02 10:48:07.991: I/xmltest(12364): eventType: 4
    10-02 10:48:07.999: I/xmltest(12364): Text Hello World!
    10-02 10:48:07.999: I/xmltest(12364): eventType: 3
    10-02 10:48:07.999: I/xmltest(12364): End tag foo
    10-02 10:48:08.006: I/xmltest(12364): eventType: 1
    10-02 10:48:08.006: I/xmltest(12364): End document

    c、另外的xml格式用法:

    /* 另类xml文件写法 */
    private void xml_misc_test(){
        String xml_test = "<foo hi=\"Hello World!\"/>";
        try {
            XR.setXML(xml_test);
            int eventType = XR.getEventType();
            Log.i(TAG,"eventType: " + eventType);
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    Log.i(TAG,"Start document");
                } else if (eventType == XmlPullParser.START_TAG) {
                    Log.i(TAG,"Start tag " + XR.getName());
                    String name = XR.getAttributeName(0);
                    String value = XR.getAttributeValue(name);
                    Log.i(TAG,"name:" + name + " value:" + value);
                } else if (eventType == XmlPullParser.END_TAG) {
                    Log.i(TAG,"End tag " + XR.getName());
                } else if (eventType == XmlPullParser.TEXT) {
                    Log.i(TAG,"Text " + XR.getText());
                }
                eventType = XR.getNextEvent();
                Log.i(TAG,"eventType: " + eventType);
            }
            Log.i(TAG,"End document");         
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ;
    }
    View Code

     输出内容:
    10-02 10:48:08.014: I/xmltest(12364): eventType: 0
    10-02 10:48:08.014: I/xmltest(12364): Start document
    10-02 10:48:08.014: I/xmltest(12364): eventType: 2
    10-02 10:48:08.014: I/xmltest(12364): Start tag foo
    10-02 10:48:08.014: I/xmltest(12364): name:hi value:Hello World!
    10-02 10:48:08.014: I/xmltest(12364): eventType: 3
    10-02 10:48:08.014: I/xmltest(12364): End tag foo
    10-02 10:48:08.014: I/xmltest(12364): eventType: 1
    10-02 10:48:08.014: I/xmltest(12364): End document

  • 相关阅读:
    全栈工程师学习Linux技术的忠告
    实战CentOS系统部署Hadoop集群服务
    如何安装最新的 XFCE 桌面?
    scrapy爬虫框架(二)
    scrapy爬虫框架(一)
    数据结构与算法(二)
    IDEA 常用快捷键
    数据结构与算法(一)
    es6之模板字符串
    es6之箭头函数
  • 原文地址:https://www.cnblogs.com/xueqiang911226/p/3132609.html
Copyright © 2011-2022 走看看