1.PULL概念
PULL解析XML的方式与SAX解析XML方式一样,也是基于事件驱动。
XmlPullParse中定义的常量:
START_DOCUMET: 读取到XML的声明返回
START_TAG: 读取到XML的开始标签返回
TEXT: 读取到XML的文本返回
END_TAG: 读取到XML的结束标签返回
END_DOCUMET: 读取到XML的结束返回
2.解析步骤
(1)创建XmlPullParserFactory对象(newInstance())
(2)根据XmlPullParserFactory对象的newPullParser()方法创建XmlPullParser解析器对象
(3)使用XmlPullParser的setInput方法设置输入流以及编码
(4)通过XmlPullParser的getEventType来获得PULL解析常用事件类型
(5)通过XmlPullParser的next获取下一个元素并触发相应事件
3.实例
需要解析的xml:
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="0">
<name>zhangmq</name>
<gender>female</gender>
<age>24</age>
</student>
<student id="1">
<name>zhouhy</name>
<gender>male</gender>
<age>24</age>
</student>
</students>
解析:
public class PullParseActivity extends Activity {
private TextView pull_parse_tv;
List<Student> students;
Student student;
String nodeName;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull);
pull_parse_tv = (TextView) findViewById(R.id.pull_parse);
pull_parse_tv.setText(pullParseXml());
}
private String pullParseXml() {
String str = "";
XmlPullParserFactory factory = null;
XmlPullParser parse = null;
InputStream is = null;
try {
is = getResources().getAssets().open("dom_info.xml");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parse = factory.newPullParser();
parse.setInput(is, "UTF-8");
//定义pull解析常用事件类型
int eventType = parse.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
Log.d("zhangmq", "XmlPullParser.START_DOCUMENT");
students = new ArrayList<Student>();
} else if (eventType == XmlPullParser.START_TAG) {
nodeName = parse.getName();
if (("student").equals(nodeName)) {
student = new Student();
students.add(student);
student.setId(parse.getAttributeValue(0));
}
} else if (eventType == XmlPullParser.END_TAG) {
Log.d("zhangmq", "XmlPullParser.END_TAG");
// 在END_TAG时,设置nodeName为null,避免解析到END_TAG,同样的parse.getName(),
// 但是parse.getText()为空的情况
nodeName = null;
if (parse.getName().equals("student")) {
str = str + student.toString() + "\n";
}
} else if (eventType == XmlPullParser.TEXT) {
Log.d("zhangmq", "XmlPullParser.TEXT ");
if (("name").equals(nodeName)) {
student.setName(parse.getText());
} else if (("gender").equals(nodeName)) {
student.setGender(parse.getText());
} else if (("age").equals(nodeName)) {
student.setAge(parse.getText());
}
}
try {
//获取下一个解析事件
eventType = parse.next();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
}
4.PULL解析与SAX解析的差别
SAX解析的工作方式是解析开始后不能控制事件的处理主动结束,处理过程自动进行。
PULL解析的工作方式是开始解析后允许应用从解析器中获取事件,可以在满足了需要的条件后不再获取事件,结束解析。
个人感觉DOM SAX PULL三种解析方式中,PULL的使用最简单。
当然也要根据需要处理的xml大小以及以及需求要合适的采用相应的解析方式。