Android 确实附带了一个 pull 解析器,其工作方式类似于 SAX。它允许您的应用程序代码从解析器中获取事件,这与 SAX 解析器自动将事件推入处理程序相反。pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件(开始元素和结束元素),但您需要使用 (parser.next()
提取它们。事件将作为数值代码被发送,因此您可以使用一个简单 case-switch。注意,解析并未像 SAX 解析那样监听元素的结束,而是在开始处完成了大部分处理。当某个元素开始时,可以调用 parser.nextText()
从 XML 文档中提取所有字符数据。还需注意,您设置了一个标记(布尔变量 done
)来确定何时到达感兴趣内容的结束部分。这允许您提早停止读取 XML 文档,因为您知道代码将不会关心文档的其余部分。这有时非常实用,特别是当您只需要访问一小部分 XML 文档时。通过尽快停止解析,您可以极大地减少解析时间。这种优化对于连接速度较慢的移动设备尤为重要。pull 解析器可以提供一些性能优势以及易用性。它还可以用于编写 XML。
这也是Android推荐使用的XML文件解析方式。
下面还是写一个测试PULL方式解析XML文件的DEMO
首先新建一个Android工程,工程结构如下图:
新建一个测试用的XML文件,名称:student.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="20110701100">
<name>张三</name>
<age>22</age>
<sex>男</sex>
</student >
<student id="20110701101">
<name>李四</name>
<age>24</age>
<sex>男</sex>
</student >
<student id="20110701102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student >
</students>
将该文件放置在assets目录下。
接下来我们定义一个JavaBean,用来存放从XML文件中解析出来的数据:
Student.java
package com.xzq.bean;
public class Student {
private String name;
private String id;
private int age;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
接着我们定义一个使用PULL方式解析XML文件的工具类:
package com.xzq.pullparser.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.xzq.pullparser.bean.Student;
public class ParserByPull {
public static List<Student> parseXML(InputStream input) {
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(input, "UTF-8");
int eventType = parser.getEventType();
Student stu = null;
List<Student> students = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
students = new ArrayList<Student>();
break;
case XmlPullParser.START_TAG:// 开始元素事件
String name = parser.getName();
if (name.equalsIgnoreCase("student")) {
stu = new Student();
stu.setId(parser.getAttributeValue(null, "id"));
} else if (stu != null) {
if (name.equalsIgnoreCase("name")) {
stu.setName(parser.nextText());// 如果后面是Text节点,即返回它的值
} else if (name.equalsIgnoreCase("age")) {
stu.setAge(new Integer(parser.nextText()));
} else if (name.equalsIgnoreCase("sex")) {
stu.setSex((parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:// 结束元素事件
if (parser.getName().equalsIgnoreCase("student")
&& stu != null) {
students.add(stu);
stu = null;
}
break;
}
eventType = parser.next();
}
input.close();
return students;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
最后是MainActivity类,该类是整个Android工程的入口,实现如下:
package com.xzq.xmlparser;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import com.xzq.bean.Student;
import com.xzq.xmlparser.util.ParserBySAX;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AssetManager asset = getAssets();
try {
InputStream input = asset.open("Student.xml");
List<Student> list = ParserBySAX.parseXML(input);
for (Student stu : list) {
System.out.println("Person ID: " + stu.getId() + ","
+ stu.getName() + ", " + stu.getAge() + ", "
+ stu.getSex());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这里,我们仅仅是将解析得到信息打印在了Logcat中,你可以在自己的应用中使用listview等空间将解析得到的数据显示在屏幕上。
对于使用PULL方式生成XML文档,下面仅给出一个代码片段,可以根据自己的情况予以适当修改:
File xmlFile = new File("myitcast.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);
writeXML(persons, writer);
writer.flush();
writer.close();
如果只想得到生成的xml字符串内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
writeXML(persons, writer);
String content = writer.toString();
public static String writeXML(List<Person> persons, Writer writer){
XmlSerializer serializer = Xml.newSerializer();
try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("", "persons");
for (Person person : persons){
serializer.startTag("", "person");
serializer.attribute("", "id", person.getId().toString());
serializer.startTag("", "name");
serializer.text(person.getName());
serializer.endTag("", "name");
serializer.startTag("", "age");
serializer.text(person.getAge().toString());
serializer.endTag("", "age");
serializer.endTag("", "person");
}
serializer.endTag("", "persons");
serializer.endDocument();
return writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
欢迎发送邮件到我的邮箱一起交流:zhognnan09@gmail.com。