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大小以及以及需求要合适的采用相应的解析方式。
原文链接:https://www.f2er.com/xml/295589.html