我来给大家介绍Android用得最多的一种解析xml数据的技术:Pull解析器解析,之前介绍过Java中两种解析xml的技术:Dom解析和SAX解析,Dom比较适合小数据量的解析,然而SAX适合大数据量的解析工作,但比较复杂。第三种解析技术Pull解析,是一种比前面两种方法更加简单的解析技术,更加符合面向对象的思想,因为这是按照我们正常的思考方式进行解析,下面来看看利用这种解析器的实现过程。
首先我们需要知道这个xml文件的内容:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<persons>
-
<person id="23">
-
<name>liming</name>
-
<age>30</age>
-
</person>
-
<person id="20">
-
<name>zhangxiaoxiao</name>
-
<age>25</age>
-
</person>
-
</persons>
复制代码
这是最典型的xml格式的数据,它有以下几个组成部分
1. START_DOCUMENT--- 文档的开始部分-
<?xml version="1.0" encoding="UTF-8"?>
2. START_TAG---开始标签
3. END_TAG---结束标签
4. END_DOCUMENT---文档结束部分
知道文档的组织结构之后,就可以往这个方向去思考怎么解析数据了定义以下方法
-
/**
-
* 获取数据
-
* @param xml
-
* @return
-
* @throws Exception
-
*/
-
public static List<Person> getPersons(InputStream xml) throws Exception {
-
List<Person> persons = null;
-
Person person = null;
-
XmlPullParser pullParser = Xml.newPullParser(); // 获取Pull解析器
-
pullParser.setInput(xml, "UTF-8");//为Pull解析器设置要解析的XML数据
-
int event = pullParser.getEventType();//获取第一次解析所产生的事件
-
while (event != pullParser.END_DOCUMENT) {
-
-
switch (event) {
-
case XmlPullParser.START_DOCUMENT:
-
persons = new ArrayList<Person>();
-
break;
-
case XmlPullParser.START_TAG:
-
if("person".equals(pullParser.getName())){
-
int id = new Integer(pullParser.getAttributeValue(0));
-
person = new Person();
-
person.setId(id);
-
}
-
if("name".equals(pullParser.getName())){
-
String name = pullParser.nextText();
-
person.setName(name);
-
}
-
if("age".equals(pullParser.getName())) {
-
int age = new Integer(pullParser.nextText());
-
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文档结构,我们当然也可以将数据保存问xml格式的数据这里需要用到Android为我们提供的xml序列化器,首先需要获得这个序列号器,然后分别设置各个标签的内容,具体实现如下:
-
/**
-
* 保存数据
-
* @param persons
-
* @param out
-
* @throws Exception
-
*/
-
public static void save(List<Person> persons, OutputStream out) throws Exception {
-
XmlSerializer serializer = Xml.newSerializer(); //得到Xml序列化器
-
serializer.setOutput(out, "UTF-8");
-
serializer.startDocument("UTF-8", true);
-
serializer.startTag(null, "persons");
-
for(Person person : persons) {
-
serializer.startTag(null, "person");
-
serializer.attribute(null, "id", person.getId().toString());
-
-
serializer.startTag(null, "name");
-
serializer.text(person.getName());
-
serializer.endTag(null, "name");
-
-
serializer.startTag(null, "age");
-
serializer.text(person.getAge().toString());
-
serializer.endTag(null, "age");
-
-
serializer.endTag(null, "person");
-
}
-
serializer.endTag(null, "persons");
-
serializer.endDocument();
-
out.flush();
-
out.close();
-
}
-
复制代码
这个方法需要传入一个集合,和一个输出流;方法调用结束后,就会把文件输出到指定目录下。
介绍完Pull解析和输出xml文件的方法之后,小巫最近学到了如何在Android下进行简单的单元测试,是一个很重要的技能。要进行单元测试需要进行以下几个步骤:1.在AndroidMenifest.xml文件中进行配置,完整的配置文件如下:
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
package="org.wwj.xml"
-
android:versionCode="1"
-
android:versionName="1.0" >
-
-
<uses-sdk
-
android:minSdkVersion="8"
-
android:targetSdkVersion="15" />
-
-
<application
-
android:icon="@drawable/ic_launcher"
-
android:label="@string/app_name"
-
android:theme="@style/AppTheme" >
-
<activity
-
android:name=".MainActivity"
-
android:label="@string/title_activity_main" >
-
<intent-filter>
-
<action android:name="android.intent.action.MAIN" />
-
-
<category android:name="android.intent.category.LAUNCHER" />
-
</intent-filter>
-
</activity>
-
<uses-library android:name="android.test.runner" />
-
</application>
-
<instrumentation android:name="android.test.InstrumentationTestRunner"
-
android:targetPackage="org.wwj.xml" android:label="Tests for My App" />
-
</manifest>
复制代码
上面的文件,如入了uses-library,和测试环境instrumentation。这是必须要做的步骤,不然无法进行单元测试。
2.定义类继承AndroidTestCase
定义一个PersonServiceTest类,继承AndroidTestCase,用于对上面的方法进行测试。
-
package org.wwj.test;
-
-
import java.io.File;
-
import java.io.FileOutputStream;
-
import java.io.InputStream;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import org.wwj.domain.Person;
-
import org.wwj.service.PersonService;
-
-
import android.test.AndroidTestCase;
-
import android.util.Log;
-
-
/**
-
* 单元测试类
-
* @author wwj
-
* 继承AndroidTestCase
-
*/
-
public class PersonServiceTest extends AndroidTestCase{
-
private final static String TAG = "PersonServiceTest"; //定义打印标签
-
-
/**
-
* 测试xml文件解析
-
* 在logcat中查看结果
-
* @throws Exception
-
*/
-
public void testPersons() throws Exception {
-
//获得输入流
-
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
-
List<Person> persons = PersonService.getPersons(xml); //解析文件,返回一个集合
-
for(Person person : persons) {//增强型for循环,打印输出信息
-
Log.i(TAG, person.toString());
-
}
-
}
-
-
-
/**
-
* 测试输出文件
-
* @throws Exception
-
*/
-
public void testSave() throws Exception {
-
List<Person> persons = new ArrayList<Person>();
-
persons.add(new Person(1, "xiaoming", 20));
-
persons.add(new Person(2, "lishi", 21));
-
persons.add(new Person(3, "wangwu", 22));
-
-
//定义一个文件,保存在当前上下文下的files目录下,输出文件为wwj.xml
-
File xmlFile = new File(getContext().getFilesDir(), "wwj.xml");
-
FileOutputStream out = new FileOutputStream(xmlFile);
-
PersonService.save(persons, out);
-
-
}
-
}
复制代码
3. 找到测试的方法,右键Run--Run Android JUnitTest如果有如下的测试效果,说明测试通过
分享到:
相关推荐
一个eclipse工程包含如何使用android中自带的xml解析器pull,解析和生成xml文件
使用Android自带的XML解析器PULL解析器简单的解析xml,并将内容显示在TestView上,代码简化过。
Android中采用Pull解析器读取和生成xml内容案例...
主要针对android中的xml文件进行解析
除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,...
支持SAX解析XML文件,DOM解析XML文件,Pull解析器解析XML文件,Pull生成XML文件,JAVA和Kotlin两种语言编写
利用android中自带的pull解析器解析和生成xml片段。
本例使用多种方式获取本地XML文件,还有通过url获取XML文件,使用Android内置的PULL解析器对XML文件进行解析,例子是解析我国各个省市。 《Android解析XML文件》博文路径:...
XML解析有三种方式 1,DOM 通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据;...Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型
Android利用pull生成xml文件
Android解析xml(3)---Pull解析
Android使用Pull解析器解析xml文件的实现代码,需要的朋友可以参考一下
Pull解析器是Android系统内置的的,Pull解析器与SAX解析器类似,他提供了类似的事件,如开始元素和介绍元素的事件,使用parser.next()可以进入下一个元素并触发相应的事件,然后进行相应的处理,当元素开始解析时,...
在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。
使用android内置的pull解析器解析xml,演示了取节点名称、取节点属性值以及取节点下文本的方式,并根据节点名称通过反射取类中的变量的值
Android解析xml文件的3种方式,在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,
主要介绍了Android App中使用Pull解析XML格式数据的使用示例,Pull是Android中自带的XML解析器,Java里也是一样用:D需要的朋友可以参考下