Android使用pull解析器解析xml文件
Android使用pull解析器解析xml文件
指尖残雪 发表于1年前
Android使用pull解析器解析xml文件
  • 发表于 1年前
  • 阅读 7
  • 收藏 0
  • 点赞 2
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

转载出处:http://blog.csdn.net/lyh7736362/article/details/6230847

以下面这个xml文件为例

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>李明</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>李向梅</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  
 

 

里面的所有东西都可以统称为节点<person>  李明  30  都为节点

而更准确的说 <person> <name> <age>为element,即为元素

而 李明 30 为text,即为文本节点

而 id 为属性,"23"为属性值

第2行与第3行之间的空格也是一个节点




新建一个person类在lyh.domain 根据xml文件设置相对应的变量和方法

[java]  view plain copy
  1. package lyh.domain;  
  2. public class Person {  
  3.     private int id;  
  4.     private String name;  
  5.     private short age;  
  6.       
  7.     public Person() {  
  8.     }  
  9.       
  10.       
  11.     public Person(int id, String name, short age) {  
  12.         this.id = id;  
  13.         this.name = name;  
  14.         this.age = age;  
  15.     }  
  16.     public Person(String name, short age) {  
  17.         this.name = name;  
  18.         this.age = age;  
  19.     }  
  20.     public int getId() {  
  21.         return id;  
  22.     }  
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.     public short getAge() {  
  33.         return age;  
  34.     }  
  35.     public void setAge(short age) {  
  36.         this.age = age;  
  37.     }  
  38.     @Override  
  39.     public String toString() {  
  40.         // TODO Auto-generated method stub  
  41.         return "id="+id+",name="+ name + ",age="+ age;  
  42.     }  
  43.       
  44. }  
 

 

 

 

编写业务bean

  1. package lyh.service;  
  2. import java.io.InputStream;  
  3. import java.io.Writer;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import lyh.domain.Person;  
  7. import org.xmlpull.v1.XmlPullParser;  
  8. import org.xmlpull.v1.XmlSerializer;  
  9. import android.util.Xml;  
  10. public class PullPersonService {  
  11.       
  12.     public static void writeXml(List<Person> persons , Writer writer) throws Exception{  
  13.           
  14.         //1.使用android的XML工具类去创建一个序列化对象  
  15.         XmlSerializer serializer =  Xml.newSerializer();  
  16.           
  17.         //2.设置xml文件输出的位置  
  18.         serializer.setOutput(writer);  
  19.           
  20.         //3.设置xml字符编码和standalone属性  
  21.         serializer.startDocument("UTF-8"true);  
  22.           
  23.         //4.设置开始标签的命名空间前缀和标签的名称,startTag与endTag应成对出现  
  24.         serializer.startTag(null"persons");  
  25.           
  26.         //5.通过迭代从list中取出每个person以便写出  
  27.         for(Person person : persons){  
  28.               
  29.             serializer.startTag(null"person");  
  30.               
  31.             //6.设置id的值  
  32.             serializer.attribute(null"id", String.valueOf(person.getId()));  
  33.               
  34.             //7.设置name的文本  
  35.             serializer.startTag(null"name");  
  36.             serializer.text(person.getName());  
  37.             serializer.endTag(null"name");  
  38.               
  39.             //8.设置age的文本  
  40.             serializer.startTag(null"age");  
  41.             serializer.text(String.valueOf(person.getAge()));  
  42.             serializer.endTag(null"age");  
  43.               
  44.             serializer.endTag(null"person");  
  45.         }  
  46.           
  47.         //9.设置结束标签的命名空间前缀和标签的名称  
  48.         serializer.endTag(null"persons");  
  49.           
  50.         //10.设置结束文档  
  51.         serializer.endDocument();  
  52.           
  53.         //11.writer为缓冲输出类,需要刷出到文件,然后关闭  
  54.         writer.flush();  
  55.         writer.close();  
  56.     }  
  57.       
  58.       
  59.     public static List<Person> readXml(InputStream inStream) throws Exception{  
  60.           
  61.         List<Person> persons = null;  
  62.         Person person = null;  
  63.           
  64.         //1.使用android提供的Xml类new一个XmlPullerParser,即new一个XmlPull解析器  
  65.         XmlPullParser parser = Xml.newPullParser();  
  66.           
  67.         //2.然后设置需要解析的xml文件,第一个参数为输入流,第二个参数为字符编码  
  68.         parser.setInput(inStream, "UTF-8");  
  69.           
  70.         //3.触发事件,当这个方法遇到某个字符符合XML语法,就会触发这个语法所代表的数字  
  71.         int eventCode = parser.getEventType();  
  72.           
  73.         //4.XML文件的第一行为开始文档事件START_DOCUMENT,最后一行为结束文档事件END_DOCUMENT,我们需要不断读取xml文件的内容  
  74.         while( XmlPullParser.END_DOCUMENT != eventCode ){  
  75.               
  76.             //5.我们对这个事件进行处理,我们感兴趣的是<person>这个元素  
  77.             switch(eventCode){  
  78.               
  79.             case XmlPullParser.START_DOCUMENT://开始文档事件  
  80.                 persons = new ArrayList<Person>();//初始化用来存放person的List  
  81.                 break;  
  82.               
  83.               
  84.             case XmlPullParser.START_TAG://6.如果这个事件是开始元素(例如<persons>)事件  
  85.                   
  86.                 if("person".equals(parser.getName())){  
  87.                     person = new Person();  
  88.                       
  89.                     //7.使用解析器得到当前元素的属性,即id  
  90.                     person.setId(new Integer(parser.getAttributeValue(0)));  
  91.                       
  92.                 }else if(person!=null){  
  93.                     if("name".equals(parser.getName())){  
  94.                         //8.如果当前元素为开始标签,下一个元素为文本,就会返回这个文本  
  95.                         person.setName(parser.nextText());  
  96.                           
  97.                     }else if("age".equals(parser.getName())){  
  98.                         //8.如果当前元素为开始标签,下一个元素为文本,就会返回这个文本  
  99.                         person.setAge(new Short(parser.nextText()));  
  100.                     }  
  101.                 }  
  102.                 break;  
  103.                   
  104.             case XmlPullParser.END_TAG://9.如果这个事件是结束元素(例如</persons>)事件  
  105.                   
  106.                 if("person".equals(parser.getName()) && person != null){  
  107.                     //往List里添加person,并把person置空,以便下次的读取  
  108.                     persons.add(person);  
  109.                     person = null;  
  110.                 }  
  111.                   
  112.                 break;  
  113.             }  
  114.             //10.当我们第一次调用getEventType()方法,得到的是XML文件的第一行,即<?xml version="1.0" encoding="UTF-8"?>,所以需要再往下一行读取  
  115.             //接着就遇到了<persons>,触发一个事件,再往下就是空格,触发一个事件,如此类推  
  116.             eventCode = parser.next();  
  117.         }  
  118.           
  119.         //11.返回储存好的list  
  120.         return persons;  
  121.     }  
  122. }  

 

编写单元测试类,需要测试时,请把itcase.xml放入到src文件夹中

[java]  view plain copy
  1. package lyh.xml;  
  2. import java.io.InputStream;  
  3. import java.util.List;  
  4. import lyh.domain.Person;  
  5. import lyh.service.PullPersonService;  
  6. import android.test.AndroidTestCase;  
  7. import android.util.Log;  
  8. public class XmlPersonServiceTest extends AndroidTestCase{  
  9.       
  10.     private static final String TAG = "PullPersonServiceTest";  
  11.       
  12.     //使用pull解析xml内容  
  13.     public void testPullReadXml() throws Exception{  
  14.         InputStream inStream = XmlPersonServiceTest.class.getClassLoader().getResourceAsStream("itcase.xml");  
  15.         List<Person> persons = PullPersonService.readXml(inStream);  
  16.         for(Person person : persons){  
  17.             Log.i(TAG, person.toString());  
  18.         }  
  19.         inStream.close();  
  20.     }  
  21. }  
 

 

 

配置AndroidManifest.xml文件,为其配置单元测试环境


在<application android:icon="@drawable/icon" android:label="@string/app_name">

下面加入

<uses-library android:name="android.test.runner"/>

在 <uses-sdk android:minSdkVersion="10" />下面加入

    <instrumentation android:name="android.test.InstrumentationTestRunner"

android:targetPackage="lyh.xml" android:label="Tests for My App"/>

注意android:targetPackage="lyh.xml" 要与原配置文件中的package的一致

 




 

在通过了单元测试以后就可以在XmlActivity中编写了

将TextView的id设置为result,将xml文件内容输出到手机屏幕上

 

[java]  view plain copy
  1. package lyh.xml;  
  2. import java.io.InputStream;  
  3. import java.util.List;  
  4. import lyh.domain.Person;  
  5. import lyh.service.PullPersonService;  
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.widget.TextView;  
  10. import android.widget.Toast;  
  11. public class XmlActivity extends Activity {  
  12.     private static final String TAG = "XmlActivity";  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.           
  18.         TextView resultView = (TextView)this.findViewById(R.id.result);  
  19.         InputStream inStream = XmlActivity.class.getClassLoader().getResourceAsStream("itcase.xml");  
  20.         try {  
  21.             List<Person> persons = PullPersonService.readXml(inStream);  
  22.             StringBuilder sb = new StringBuilder();  
  23.             for( Person person : persons){  
  24.                 sb.append(person.toString()).append("/n");  
  25.             }  
  26.             resultView.setText(sb.toString());  
  27.         } catch (Exception e) {  
  28.             Log.e(TAG, e.toString());  
  29.             Toast.makeText(this"解析失败", Toast.LENGTH_LONG).show();  
  30.         }  
  31.     }  
  32. }  
 


 

 

 

使用pull输出xml文件

在PullPersonService编写一个writeXml方法

[java]  view plain copy
  1. public static void writeXml(List<Person> persons , Writer writer) throws Exception{  
  2.           
  3.         //1.使用android的XML工具类去创建一个序列化对象  
  4.         XmlSerializer serializer =  Xml.newSerializer();  
  5.           
  6.         //2.设置xml文件输出的位置  
  7.         serializer.setOutput(writer);  
  8.           
  9.         //3.设置xml字符编码和standalone属性  
  10.         serializer.startDocument("UTF-8"true);  
  11.           
  12.         //4.设置开始标签的命名空间前缀和标签的名称,startTag与endTag应成对出现  
  13.         serializer.startTag(null"persons");  
  14.           
  15.         //5.通过迭代从list中取出每个person以便写出  
  16.         for(Person person : persons){  
  17.               
  18.             serializer.startTag(null"person");  
  19.               
  20.             //6.设置id的值  
  21.             serializer.attribute(null"id", String.valueOf(person.getId()));  
  22.               
  23.             //7.设置name的文本  
  24.             serializer.startTag(null"name");  
  25.             serializer.text(person.getName());  
  26.             serializer.endTag(null"name");  
  27.               
  28.             //8.设置age的文本  
  29.             serializer.startTag(null"age");  
  30.             serializer.text(String.valueOf(person.getAge()));  
  31.             serializer.endTag(null"age");  
  32.               
  33.             serializer.endTag(null"person");  
  34.         }  
  35.           
  36.         //9.设置结束标签的命名空间前缀和标签的名称  
  37.         serializer.endTag(null"persons");  
  38.           
  39.         //10.设置结束文档  
  40.         serializer.endDocument();  
  41.           
  42.         //11.writer为缓冲输出类,需要刷出到文件,然后关闭  
  43.         writer.flush();  
  44.         writer.close();  
  45.     }  
 

 

 

 

在XmlPersonServiceTest中写一个单元测试,当然也可以在activity中写,不过最好先进行单元测试

[java]  view plain copy
  1. //使用pull写入xml内容  
  2.     public void testPullWriteXml() throws Exception{  
  3.         //1.设置输出流,输出到persons.xml且这个文件的权限为可读的  
  4.         FileOutputStream outStream = this.getContext().openFileOutput("persons.xml",Context.MODE_WORLD_READABLE);  
  5.         OutputStreamWriter writer = new OutputStreamWriter(outStream,"UTF-8");  
  6.         List<Person> persons = new ArrayList<Person>();  
  7.         persons.add(new Person(11,"老毛",(short)20));  
  8.         persons.add(new Person(12,"撒旦",(short)30));  
  9.         persons.add(new Person(13,"飞飞",(short)31));  
  10.         PullPersonService.writeXml(persons,writer);  
  11.         outStream.flush();  
  12.         outStream.close();  
  13.     }  
 

 

 

 

 

 

进行单元测试以后就可以使用文件浏览器到data.lyh.xml.files文件夹下查看到persons.xml文件了,可以使用右上方的 Pull a file from the device按钮把文件提取到电脑上查看

共有 人打赏支持
粉丝 8
博文 73
码字总数 0
×
指尖残雪
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: