安卓中使用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; } };
为方便其它程序简洁使用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(); } };
需要读取的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>
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()); } }
相应的打印内容:
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 ; }
输出内容:
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 ; }
输出内容:
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