Android XML解析之Pull

转自:http://telecom.chinaitlab.com/ydkf/872500.html

Pull解析XML文档;

首先建一个android项目,在cn.class3g.service里建一个名为person_list,xml:

view plain copy to clipboard print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="111">  
  4.         <name>Tom</name>  
  5.         <age>20</age>  
  6.     </person>  
  7.     <person id="222">  
  8.         <name>Mary</name>  
  9.         <age>17</age>  
  10.     </person>  
  11. </persons>  
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="111"> <name>Tom</name> <age>20</age> </person> <person id="222"> <name>Mary</name> <age>17</age> </person> </persons>
在cn.class3g.domain包下封装javabean,person:

 

 

view plain copy to clipboard print ?
  1. package cn.class3g.domain;  
  2.   
  3. public class Person {  
  4.     private int id;  
  5.     private String name;  
  6.     private int age;  
  7.   
  8.     public Person() {  
  9.     }  
  10.   
  11.     public Person(int id, String name, int age) {  
  12.         super();  
  13.         this.id = id;  
  14.         this.name = name;  
  15.         this.age = age;  
  16.     }  
  17.   
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.   
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.   
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.   
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     public int getAge() {  
  35.         return age;  
  36.     }  
  37.   
  38.     public void setAge(int age) {  
  39.         this.age = age;  
  40.     }  
  41.   
  42.     public String toString() {  
  43.         return "Person [id=" + id + "name=" + name + "age=" + age + "]";  
  44.     }  
  45.   
  46. }  
package cn.class3g.domain; public class Person { private int id; private String name; private int age; public Person() { } public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
在service包下创建PersonHandler类:

 

view plain copy to clipboard print ?
  1. <pre name="code" class="html">package cn.class3g.service;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.Writer;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import org.xmlpull.v1.XmlPullParser;  
  9. import org.xmlpull.v1.XmlSerializer;  
  10.   
  11. import android.util.Xml;  
  12.   
  13. import cn.class3g.domain.Person;  
  14.   
  15. public class PullPersonService {  
  16.   
  17.     public static List<Person> getPersonList(InputStream inStream)  
  18.             throws Exception {  
  19.         List<Person> personList = null;  
  20.         //拿到XmlPullParser解析器  
  21.         XmlPullParser parser = Xml.newPullParser();  
  22.         //统一编码  
  23.         parser.setInput(inStream, "utf-8");  
  24.           
  25.         int eventType = parser.getEventType();  
  26.         //创建一个person对象  
  27.         Person person = null;  
  28.         //开始解析  
  29.         while (eventType != XmlPullParser.END_DOCUMENT) {  
  30.             switch (eventType) {  
  31.             case XmlPullParser.START_DOCUMENT:  
  32.                 personList = new ArrayList<Person>();  
  33.                 break;  
  34.             case XmlPullParser.START_TAG:  
  35.                 // 判断当前元素名是否为person  
  36.                 if ("person".equals(parser.getName())) {  
  37.                     person = new Person();  
  38.                     person.setId(Integer.valueOf(parser.getAttributeValue(0)));  
  39.                 } else if ("name".equals(parser.getName())) {  
  40.                     person.setName(parser.nextText());  
  41.                 } else if ("age".equals(parser.getName())) {  
  42.                     person.setAge(Integer.valueOf(parser.nextText()));  
  43.                 }  
  44.                 break;  
  45.             case XmlPullParser.END_TAG:  
  46.                 if ("person".equals(parser.getName()) && person != null) {  
  47.                     personList.add(person);  
  48.                     person = null;  
  49.                 }  
  50.                 break;  
  51.             }  
  52.   
  53.             // next方法的调用导致下一个节点的解析,同时返回下一个节点解析的事件类型代码  
  54.             eventType = parser.next();  
  55.         }  
  56.         return personList;  
  57.     }  
  58. }  
<pre name="code" class="html">package cn.class3g.service; import java.io.InputStream; import java.io.Writer; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; import cn.class3g.domain.Person; public class PullPersonService { public static List<Person> getPersonList(InputStream inStream) throws Exception { List<Person> personList = null; //拿到XmlPullParser解析器 XmlPullParser parser = Xml.newPullParser(); //统一编码 parser.setInput(inStream, "utf-8"); int eventType = parser.getEventType(); //创建一个person对象 Person person = null; //开始解析 while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: personList = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: // 判断当前元素名是否为person if ("person".equals(parser.getName())) { person = new Person(); person.setId(Integer.valueOf(parser.getAttributeValue(0))); } else if ("name".equals(parser.getName())) { person.setName(parser.nextText()); } else if ("age".equals(parser.getName())) { person.setAge(Integer.valueOf(parser.nextText())); } break; case XmlPullParser.END_TAG: if ("person".equals(parser.getName()) && person != null) { personList.add(person); person = null; } break; } // next方法的调用导致下一个节点的解析,同时返回下一个节点解析的事件类型代码 eventType = parser.next(); } return personList; } }

 

 

接下来测试,在activity包下创建Test测试类:

 

view plain copy to clipboard print ?
  1. package cn.class3g.activity;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import cn.class3g.domain.Person;  
  8. import cn.class3g.service.PullPersonService;  
  9.   
  10. import android.test.AndroidTestCase;  
  11. import android.util.Log;  
  12.   
  13. public class Test extends AndroidTestCase {  
  14.   
  15.     public void testPull() throws Throwable {  
  16.         InputStream inStream = this.getClass().getClassLoader()  
  17.                 .getResourceAsStream("person_list.xml");  
  18.         List<Person> personList = PullPersonService.getPersonList(inStream);  
  19.         Log.i("TAG", personList.toString());          
  20.     }  
  21. }  
package cn.class3g.activity; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import cn.class3g.domain.Person; import cn.class3g.service.PullPersonService; import android.test.AndroidTestCase; import android.util.Log; public class Test extends AndroidTestCase { public void testPull() throws Throwable { InputStream inStream = this.getClass().getClassLoader() .getResourceAsStream("person_list.xml"); List<Person> personList = PullPersonService.getPersonList(inStream); Log.i("TAG", personList.toString()); } }
在测试前在清单中添加测试权限:

 

view plain copy to clipboard print ?
  1. <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.class3g.activity"></instrumentation>  
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.class3g.activity"></instrumentation>
利用Android JUnit Test测试:

 

控制台输出:


另外两篇http://blog.csdn.net/qeqeqe236/article/details/6990245

http://yangguangfu.iteye.com/blog/832277

测试成功

你可能感兴趣的:(Android XML解析之Pull)