andoird --- XmlPullParser 的使用

来源:互联网 发布:nature数据库 东南大学 编辑:程序博客网 时间:2024/04/28 23:13

http://blog.csdn.net/andyhuabing/article/details/8036340

有个升级项目需要使用到xml文件,由于XmlPullParser最简单所以选择它也完全满足当前的需求应用。
下面就简要的说明一下具体的用法。

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

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

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

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

[java] view plaincopyprint?
  1. <span style="font-size:18px;">public class MainActivity extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_main);          
  6.         xmltest xl = new xmltest();  
  7.         xl.test(getResources());  
  8.     }  
  9.    }</span>  

为了便于xml解析内容的存取,新建了一个Person.java类,内容如下:
[java] view plaincopyprint?
  1. <span style="font-size:18px;">package com.test.xmlactivity;  
  2.   
  3. class Person{  
  4.     private int id = -1;  
  5.     private int age = 0;  
  6.     private String name = null;  
  7.     private String title = null;  
  8.       
  9.     public Person(){  
  10.         //TODO  
  11.     }  
  12.       
  13.     public Person(int _id,int _age,String _name,String _title){  
  14.         this.id = _id ;  
  15.         this.age = _id;  
  16.         this.name = _name;  
  17.         this.title = _title;  
  18.     }  
  19.       
  20.     public void setID(int id){  
  21.         this.id = id;  
  22.     }  
  23.       
  24.     public int getID(){  
  25.         return this.id;  
  26.     }  
  27.       
  28.     public void setAge(int age){  
  29.         this.age = age;  
  30.     }  
  31.       
  32.     public int getAge(){  
  33.         return this.age;  
  34.     }  
  35.       
  36.     public void setName(String name){  
  37.         this.name = name;  
  38.     }  
  39.       
  40.     public String getName(){  
  41.         return this.name;  
  42.     }  
  43.       
  44.     public void setTitle(String title){  
  45.         this.title = title;  
  46.     }  
  47.       
  48.     public String getTitle(){  
  49.         return this.title;  
  50.     }  
  51. };</span>  

为方便其它程序简洁使用xml的读取及解析,封装了一个xmlReader.java类,内容如下:
[java] view plaincopyprint?
  1. <span style="font-size:18px;">package com.test.xmlactivity;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.StringReader;  
  5.   
  6. import org.xmlpull.v1.XmlPullParser;  
  7. import org.xmlpull.v1.XmlPullParserException;  
  8. import org.xmlpull.v1.XmlPullParserFactory;  
  9.   
  10. import android.util.Log;  
  11.   
  12. class XmlReader{  
  13.     private final static String TAG = "XmlReader";  
  14.     private XmlPullParser xmlparser = null;  
  15.     public static final String charset = "utf-8";  
  16.       
  17.     public XmlReader(){  
  18.         try {  
  19.             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  20.             factory.setNamespaceAware(true);  
  21.             xmlparser = factory.newPullParser();  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.             Log.e(TAG,"create xml reader failed");  
  25.         }  
  26.     }  
  27.   
  28.     public void setXML(String xml) throws IOException{  
  29.         try {  
  30.             xmlparser.setInput(new StringReader(xml));  
  31.         } catch (Exception e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35.           
  36.     public int getNextEvent() throws IOException {  
  37.         try {  
  38.             return xmlparser.next();   
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.         return -1;  
  43.     }  
  44.       
  45.     public String getNextText() throws IOException{  
  46.         try {  
  47.             return xmlparser.nextText();  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.         return null;  
  52.     }  
  53.       
  54.     public int getEventType() throws IOException {  
  55.         try {  
  56.             return xmlparser.getEventType();  
  57.         } catch (Exception e) {  
  58.             e.printStackTrace();  
  59.         }  
  60.         return -1;  
  61.     }  
  62.       
  63.     public String getName() {  
  64.         return xmlparser.getName();  
  65.     }  
  66.       
  67.     public String getText() {  
  68.         return xmlparser.getText();  
  69.     }     
  70.       
  71.     public int attributeCount() {  
  72.         return xmlparser.getAttributeCount();  
  73.     }  
  74.   
  75.     public String getAttributeName(int i) {  
  76.         return xmlparser.getAttributeName(i);  
  77.     }  
  78.   
  79.     public String getAttributeValue(String name) {  
  80.         String v = xmlparser.getAttributeValue(null, name);  
  81.         return v;  
  82.     }  
  83.       
  84.     public int getDepth() {  
  85.         return xmlparser.getDepth();  
  86.     }  
  87. };  
  88. </span>  


需要读取的xml资源文件放在 res\xm;\person.xml,其具体内容如下:
[html] view plaincopyprint?
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <White-collars>  
  3.     <employee id="1">  
  4.         <name>tom</name>  
  5.         <age>25</age>  
  6.         <title>engineer</title>  
  7.     </employee>  
  8.   
  9.     <employee  id="2">  
  10.         <name>kite</name>  
  11.         <age>21</age>  
  12.         <title>tester</title>  
  13.     </employee>  
  14.   
  15.     <employee id="3">  
  16.         <name>rose</name>  
  17.         <age>28</age>  
  18.         <title>manager</title>  
  19.     </employee>  
  20.   
  21. </White-collars>  
  22. </span>  

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内容解析:
[java] view plaincopyprint?
  1. <span style="font-size:18px;">  /* 1、使用文件测试 */  
  2.     private void xml_file_test(){  
  3.         int eventType = -1;  
  4.         Person ps = null;     
  5.         XmlResourceParser xrp = mRes.getXml(R.xml.personal);          
  6.           
  7.         try {  
  8.             eventType = xrp.getEventType();  
  9.             while (eventType != XmlPullParser.END_DOCUMENT) {  
  10.                 switch (eventType) {  
  11.                 case XmlPullParser.START_DOCUMENT:  
  12.                     break;  
  13.                 case XmlPullParser.END_DOCUMENT:  
  14.                     break;  
  15.                 case XmlPullParser.START_TAG: {  
  16.                     String tagName = xrp.getName();  
  17.                     if (tagName != null && tagName.equals("employee")) {  
  18.                         ps = new Person();  
  19.                         int id = Integer.parseInt(xrp.getAttributeValue(null"id"));  
  20.                         ps.setID(id);  
  21.                     }  
  22.   
  23.                     if (tagName != null && tagName.equals("name")) {  
  24.                         String name;  
  25.                         try {  
  26.                             name = xrp.nextText();;  
  27.                             ps.setName(name);  
  28.                         } catch (IOException e) {  
  29.                             e.printStackTrace();  
  30.                         }  
  31.                     }  
  32.   
  33.                     if (tagName != null && tagName.equals("title")) {  
  34.                         String title;  
  35.                         try {  
  36.                             title = xrp.nextText();  
  37.                             ps.setTitle(title);  
  38.                         } catch (IOException e) {  
  39.                             e.printStackTrace();  
  40.                         }  
  41.                     }  
  42.   
  43.                     if (tagName != null && tagName.equals("age")) {  
  44.                         String age;  
  45.                         try {  
  46.                             age = xrp.nextText();  
  47.                             ps.setAge(Integer.parseInt(age));  
  48.                         } catch (IOException e) {  
  49.                             e.printStackTrace();  
  50.                         }  
  51.                     }  
  52.                 }  
  53.                     break;  
  54.                 case XmlPullParser.END_TAG: {  
  55.                     if (xrp.getName().equals("employee")) {  
  56.                         mperlist.add(ps);  
  57.                     }  
  58.                 }  
  59.                     break;  
  60.                 case XmlPullParser.TEXT:  
  61.                     break;  
  62.                 default:  
  63.                     break;  
  64.                 }  
  65.   
  66.                 eventType = xrp.next();  
  67.             }  
  68.         } catch (Exception e) {  
  69.             // TODO: handle exception  
  70.         }  
  71.           
  72.         for(int i=0;i<mperlist.size();i++){  
  73.             Log.i(TAG,"person info ====");  
  74.             Log.i(TAG,"ID = " + mperlist.get(i).getID());     
  75.             Log.i(TAG,"name = "+ mperlist.get(i).getName());  
  76.             Log.i(TAG,"age = " + mperlist.get(i).getAge());   
  77.             Log.i(TAG,"title = " + mperlist.get(i).getTitle());  
  78.         }  
  79.     }</span>  


相应的打印内容:
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、直接从内存中读取
[java] view plaincopyprint?
  1. <span style="font-size:18px;">  /* 直接使用内存测试 */  
  2.     private void xml_memory_test(){  
  3.         String xml_test = "<foo>Hello World!</foo>";  
  4.         try {  
  5.             XR.setXML(xml_test);  
  6.   
  7.             int eventType = XR.getEventType();  
  8.             Log.i(TAG,"eventType: " + eventType);  
  9.             while (eventType != XmlPullParser.END_DOCUMENT) {  
  10.                 if (eventType == XmlPullParser.START_DOCUMENT) {  
  11.                     Log.i(TAG,"Start document");  
  12.                 } else if (eventType == XmlPullParser.START_TAG) {  
  13.                     Log.i(TAG,"Start tag " + XR.getName());  
  14.                 } else if (eventType == XmlPullParser.END_TAG) {  
  15.                     Log.i(TAG,"End tag " + XR.getName());  
  16.                 } else if (eventType == XmlPullParser.TEXT) {  
  17.                     Log.i(TAG,"Text " + XR.getText());  
  18.                 }  
  19.                 eventType = XR.getNextEvent();  
  20.                 Log.i(TAG,"eventType: " + eventType);  
  21.             }  
  22.             Log.i(TAG,"End document");            
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         return ;  
  27.     }</span>  


输出内容:
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格式用法
[java] view plaincopyprint?
  1. <span style="font-size:18px;">  /* 另类xml文件写法 */  
  2.     private void xml_misc_test(){  
  3.         String xml_test = "<foo hi=\"Hello World!\"/>";  
  4.         try {  
  5.             XR.setXML(xml_test);  
  6.   
  7.             int eventType = XR.getEventType();  
  8.             Log.i(TAG,"eventType: " + eventType);  
  9.             while (eventType != XmlPullParser.END_DOCUMENT) {  
  10.                 if (eventType == XmlPullParser.START_DOCUMENT) {  
  11.                     Log.i(TAG,"Start document");  
  12.                 } else if (eventType == XmlPullParser.START_TAG) {  
  13.                     Log.i(TAG,"Start tag " + XR.getName());  
  14.                     String name = XR.getAttributeName(0);  
  15.                     String value = XR.getAttributeValue(name);  
  16.                     Log.i(TAG,"name:" + name + " value:" + value);  
  17.                 } else if (eventType == XmlPullParser.END_TAG) {  
  18.                     Log.i(TAG,"End tag " + XR.getName());  
  19.                 } else if (eventType == XmlPullParser.TEXT) {  
  20.                     Log.i(TAG,"Text " + XR.getText());  
  21.                 }  
  22.                 eventType = XR.getNextEvent();  
  23.                 Log.i(TAG,"eventType: " + eventType);  
  24.             }  
  25.             Log.i(TAG,"End document");            
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.         return ;  
  30.     }</span>  


输出内容:
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

0 0
原创粉丝点击