android解析XML文件

来源:互联网 发布:手机视频软件 编辑:程序博客网 时间:2024/06/05 04:01

一、基本介绍

对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml。xmlpull不仅可用在android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。

 

jar包下载网址
http://www.xmlpull.org/
http://kxml.sourceforge.NET/

 

二、例子

读取到xml的声明返回数字0 START_DOCUMENT; 
读取到xml的结束返回数字1 END_DOCUMENT ; 
读取到xml的开始标签返回数字2 START_TAG 
读取到xml的结束标签返回数字3 END_TAG 
读取到xml的文本返回数字4 TEXT

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <people>  
  3.     <person id="001">  
  4.         <name>XY1</name>  
  5.         <age>22</age>  
  6.     </person>  
  7.     <person id="002">  
  8.         <name>XY2</name>  
  9.         <age>22</age>  
  10.     </person>  
  11. </people>  

 

[java] view plain copy
 print?
  1. package cn.xy.service;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  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. import cn.xy.model.Person;  
  13.   
  14. /** 
  15.  * 利用pull解析器解析XML 
  16.  *  
  17.  * @author XY 
  18.  *  
  19.  */  
  20. public class PersonService  
  21. {  
  22.     /** 
  23.      * 从XML文件中读取数据 
  24.      *  
  25.      * @param xml XML文件输入流 
  26.      */  
  27.     public List<Person> getPeople(InputStream xml) throws Exception  
  28.     {  
  29.         List<Person> lst = null;  
  30.         Person person = null;  
  31.   
  32.         // 利用ANDROID提供的API快速获得pull解析器  
  33.         XmlPullParser pullParser = Xml.newPullParser();  
  34.   
  35.         // 设置需要解析的XML数据  
  36.         pullParser.setInput(xml, "UTF-8");  
  37.   
  38.         // 取得事件  
  39.         int event = pullParser.getEventType();  
  40.   
  41.         // 若为解析到末尾  
  42.         while (event != XmlPullParser.END_DOCUMENT) // 文档结束  
  43.         {  
  44.             String nodeName = pullParser.getName();  
  45.             switch (event)  
  46.             {  
  47.                 case XmlPullParser.START_DOCUMENT: // 文档开始  
  48.                     lst = new ArrayList<Person>();  
  49.                     break;  
  50.                 case XmlPullParser.START_TAG: // 标签开始  
  51.                     if ("person".equals(nodeName))  
  52.                     {  
  53.                         String id = pullParser.getAttributeValue(0);  
  54.                         person = new Person();  
  55.                         person.setId(id);  
  56.                     }  
  57.                     if ("name".equals(nodeName))  
  58.                     {  
  59.                         String name = pullParser.nextText();  
  60.                         person.setName(name);  
  61.                     }  
  62.                     if ("age".equals(nodeName))  
  63.                     {  
  64.                         int age = Integer.valueOf(pullParser.nextText());  
  65.                         person.setAge(age);  
  66.                     }  
  67.                     break;  
  68.                 case XmlPullParser.END_TAG: // 标签结束  
  69.                     if ("person".equals(nodeName))  
  70.                     {  
  71.                         lst.add(person);  
  72.                         person = null;  
  73.                     }  
  74.                     break;  
  75.             }  
  76.             event = pullParser.next(); // 下一个标签  
  77.         }  
  78.         return lst;  
  79.     }  
  80.   
  81.     /** 
  82.      * 向XML写入数据 
  83.      *  
  84.      * @param os 
  85.      * @param person 
  86.      * @throws Exception 
  87.      */  
  88.     public void saveDataToXML(OutputStream os, List<Person> lst) throws Exception  
  89.     {  
  90.         XmlSerializer xs = Xml.newSerializer();  
  91.         xs.setOutput(os, "UTF-8");  
  92.         xs.startDocument("UTF-8"true);  
  93.         xs.startTag(null"people");  
  94.         for (Person p : lst)  
  95.         {  
  96.             xs.startTag(null"person");  
  97.             xs.attribute(null"person", p.getId());  
  98.   
  99.             xs.startTag(null"name");  
  100.             xs.text(p.getName());  
  101.             xs.endTag(null"name");  
  102.   
  103.             xs.startTag(null"age");  
  104.             xs.text(p.getAge().toString());  
  105.             xs.endTag(null"age");  
  106.   
  107.             xs.endTag(null"person");  
  108.         }  
  109.         xs.endTag(null"people");  
  110.         xs.endDocument();  
  111.         os.flush();  
  112.         os.close();  
  113.     }  
  114. }  
[java] view plain copy
 print?
  1. public class TestClass extends AndroidTestCase  
  2. {  
  3.     public void testPeople() throws Exception  
  4.     {  
  5.         PersonService ps = new PersonService();  
  6.         InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");  
  7.         List<Person> lst = ps.getPeople(xml);  
  8.         Assert.assertEquals("XY1", lst.get(0).getName());  
  9.     }  
  10.   
  11.     public void testSave() throws Exception  
  12.     {  
  13.         PersonService ps = new PersonService();  
  14.         List<Person> lst = new ArrayList<Person>();  
  15.         lst.add(new Person("0001""XY0001"20));  
  16.         lst.add(new Person("0002""XY0002"20));  
  17.         File xmlFile = new File(this.getContext().getFilesDir(), "xy.xml"); // data/data/package name/files  
  18.         OutputStream os = new FileOutputStream(xmlFile);  
  19.         ps.saveDataToXML(os, lst);  
  20.     }  
  21. }