android关于pull解析步骤如下:
一、介绍: 此文主要是介绍利用pull解析器读取手机上的xml文件和把对象保存到xml文件中 二、新建一个android工程——PullXml 工程目录:
三、清单列表AndroidManifest.xml的配置为: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="" package="com.example.pull" android:versionCode="1" android:versionName="1.0" ><uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <!--单元测试 加这句--> <uses-library android:name="android.test.runner" /> <activity android:name=".PullXml6Activity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!--单元测试加这句,其中android:targetPackage为当前应用的包名 android:targetPackage 目标包是指单元测试的类的上面包和manifest的 package="com.example.pull" 保持一致 这样就决定了你建立测试类的时候也必须在这个包下面 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.pull" android:label="Test for my app"/>"</manifest> 四、Person .java实体类源码: package com.example.domain; public class Person { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } public Person(Integer id, String name, Integer age) { super(); this.id = id; this.name = name; this.age = age; } public Person() { super(); // TODO Auto-generated constructor stub } } 五、PersonService .java业务类源码package com.example.service; import java.io.IOException; import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory;import org.xmlpull.v1.XmlSerializer;import android.util.Xml; import com.example.domain.Person; public class PersonService { //由于没有使用类的成员变量所以可以把此方法声明为static方法 public static List<Person> getPersons(InputStream xml) throws Exception{ //XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser(); XmlPullParser pullParser = Xml.newPullParser();//得到XmlPullParser实例 pullParser.setInput(xml,"UTF-8");//把xml放入pull解析器中 int event = pullParser.getEventType();//得到触发的事件类型,为整形,跟踪返回的数字来选择要处理内容 //xml节点(node)分 element节点和text节点,<elment节点>text节点</emenet节点> ArrayList<Person> persons=null; Person person = null; while(event != XmlPullParser.END_DOCUMENT){//判断是否读取文档结尾,为结尾跳出循环 //0:文档开始 1:XmlPullParser.END_DOCUMENT 2:节点 switch(event){//选择事件 case XmlPullParser.START_DOCUMENT://文档开始 persons = new ArrayList<Person>();//创建一个数组 break; case XmlPullParser.START_TAG://节点开始标志 if("person".equals(pullParser.getName())){//当节点在person时 int id = Integer.parseInt(pullParser.getAttributeValue(0));//得到第一个节点的Id值 person = new Person(); person.setId(id); } if("name".equals(pullParser.getName())){//当节点指到name时 String name = pullParser.nextText();//取得name节点后面的text节点的值 if(person!=null){ person.setName(name); } } if("age".equals(pullParser.getName())){//当节点指到age时 int age = Integer.parseInt(pullParser.nextText());//取得age节点后面的text节点的值 if(person!=null){ person.setAge(age); } } break; case XmlPullParser.END_TAG://节点结束标志 if("person".equals(pullParser.getName())){ persons.add(person); person = null; } break; } event = pullParser.next(); } return persons; } /** * 保存数据导xml文件中 * @param persons 数据 * @param out 输出方向 * @throws Exception */ public static void save(List<Person> persons,OutputStream out) throws Exception{ //要用Pull解释器保存数据导XML中,要先得到一个xml序列化器 XmlSerializer serializer = Xml.newSerializer(); //设置内容的输出方向以及字符编码 serializer.setOutput(out,"UTF-8"); //设置文档开始,第二个参数:是否可以单独存在(true时:standalone='yes';false时:standalone='no') serializer.startDocument("UTF-8", true); //设置persons节点开始 serializer.startTag(null, "persons"); //循环迭代创建person节点以及name和age节点 for(Person person:persons){ //startTag参数:第一个是命名空间,第二个是开始节点名称 serializer.startTag(null, "person"); //attribute参数:第一个是命名空间,第二个是节点属性名称,第三个是节点属性值 serializer.attribute(null, "id", person.getId().toString()); serializer.startTag(null, "name"); //text参数:text节点的值 serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString()); serializer.endTag(null, "age"); //endTag参数:第一个是命名空间,第二个是结束节点名称 serializer.endTag(null, "person"); } //设置persons节点结束 serializer.endTag(null, "persons"); //设置文档结束 serializer.endDocument(); out.flush();// out.close(); } }六、PersonServiceTest .java测试类源码: package com.example.test; import java.io.File; import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import com.example.domain.Person; import com.example.service.PersonService;import android.test.AndroidTestCase; import android.util.Log;public class PersonServiceTest extends AndroidTestCase { public void testGetPersons() throws Exception{ InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml"); List<Person> persons = PersonService.getPersons(xml); for(Person person:persons){ Log.i("PersonService", person.toString()); } } public void testSave() throws Exception{ List<Person> persons = new ArrayList<Person>(); persons.add(new Person(43,"zhangxx",20)); persons.add(new Person(53,"lili",21)); persons.add(new Person(423,"xiaoxiao",18)); persons.add(new Person(412,"mimi",17)); //包/files File xmlFile = new File(getContext().getFilesDir(),"test.xml"); FileOutputStream fos = new FileOutputStream(xmlFile); PersonService.save(persons, fos); }}七、person.xml内容:<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="22"> <name>dada</name> <age>21</age> </person> <person id="100"> <name>mm</name> <age>28</age> </person></persons>
八、注意事项以及相关知识点: 1、pull解析器工作原理同sax 2、pull解析xml文档特点: 从上到下顺序的读取,一个节点挨着一个节点的读取 xml节点分element节点和text节点 xml文档有开始和结束标志,节点也有开始和结束标志,如下标志: <?xml version="1.0" encoding="UTF-8"?>//xml文档开始 <persons>//根节点开始 <person id="22"> <name>dada</name> <age>21</age> </person> <person id="100"> <name>mm</name> <age>28</age> </person> </persons>//根节点结束//xml文档结束 |