一、书上内容
PULL解析XML的方式与SAX解析XML的方式一样,它也是基于事件驱动的。使用PULL解析器解析XML文件时应注意以下几点:
(1)通过Xml.newPullParser()获得解析器。
(2)通过pullParser.setInput(inputStream, "utf-8")设置输入流以及编码。
(3)通过pullParser.next()获取下一元素并触发相应事件。
XMLPullParser中定义了常量来标识各种解析事件。
(1)
常量:START_DOCUMENT
常量所标识的解析事件:读取到XML的声明返回
(2)
常量:END_DOCUMENT
常量所标识的解析事件:读取到XML的结束返回
(3)
常量:START_TAG
常量所标识的解析事件:读取到XML的开始标签返回
(4)
常量:END_TAG
常量所标识的解析事件:读取到XML的结束标签返回
(5)
常量:TEXT
常量所标识的解析事件:读取到XML的文本返回
二、自己项目
1、解析步骤
2、项目代码
//MainActivity.java
//MyPullParser.java
//Person.java
//Persons.xml
PULL解析XML的方式与SAX解析XML的方式一样,它也是基于事件驱动的。使用PULL解析器解析XML文件时应注意以下几点:
(1)通过Xml.newPullParser()获得解析器。
(2)通过pullParser.setInput(inputStream, "utf-8")设置输入流以及编码。
(3)通过pullParser.next()获取下一元素并触发相应事件。
XMLPullParser中定义了常量来标识各种解析事件。
(1)
常量:START_DOCUMENT
常量所标识的解析事件:读取到XML的声明返回
(2)
常量:END_DOCUMENT
常量所标识的解析事件:读取到XML的结束返回
(3)
常量:START_TAG
常量所标识的解析事件:读取到XML的开始标签返回
(4)
常量:END_TAG
常量所标识的解析事件:读取到XML的结束标签返回
(5)
常量:TEXT
常量所标识的解析事件:读取到XML的文本返回
二、自己项目
1、解析步骤
XmlPullParser pullParser=Xml.newPullParser();
pullParser.setInput(inputStream, "utf-8");
int event=pullParser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT:break;
case XmlPullParser.START_TAG:break;
case XmlPullParser.TEXT:break;
case XmlPullParser.END_TAG:break;
case XmlPullParser.END_DOCUMENT:break;
}
event=pullParser.next();
}
2、项目代码
//MainActivity.java
InputStream inputStream=MainActivity.class.getClassLoader().getResourceAsStream("Persons.xml");
ArrayList<Person> persons=MyPullParser.getList(inputStream);
for(int i=0;i<persons.size();i++)
{
Person person=persons.get(i);
tv_parse.append("\nid="+person.getId()+";age="+person.getAge()+";name="+person.getName());
}
//MyPullParser.java
public class MyPullParser
{
static Person person;
static ArrayList<Person> persons;
static String element;
static final String TAG="myPull";
public static ArrayList<Person>getList(InputStream inputStream)
{
XmlPullParser pullParser=Xml.newPullParser();
try
{
pullParser.setInput(inputStream, "utf-8");
int event=pullParser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT:
persons=new ArrayList<Person>();
Log.i(TAG,"now begin to parse document");
break;
case XmlPullParser.START_TAG:
element=pullParser.getName();
if(element.equals("Person"))
{
person=new Person();
String id=pullParser.getAttributeValue(0);
person.setId(id);
}
Log.i(TAG, "now begin to parse the element value:"+element);
break;
case XmlPullParser.TEXT:
String s=pullParser.getText().trim();
if(!s.equals(""))
{
if(element.equals("name"))
{
person .setName(s);
}
else if(element.equals("age"))
{
person .setAge(s);
}
Log.i(TAG, "now parse the element value:"+s);
}
break;
case XmlPullParser.END_TAG:
element=pullParser.getName();
if(element.equals("Person"))
{
persons.add(person);
person=null;
}
Log.i(TAG, "now end the element value:"+element);
break;
case XmlPullParser.END_DOCUMENT:
Log.i(TAG,"now end the document");
break;
}
event=pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return persons;
}
}
//Person.java
public class Person
{
String id;
String name;
String age;
public Person()
{
super();
id="0";
name="王二";
age="50";
}
public Person(String id, String name, String age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
//Persons.xml
<Persons>
<Person id="1">
<name>张三</name>
<age>20</age>
</Person>
<Person id="2">
<name>李四</name>
<age>30</age>
</Person>
<Person id="3">
<name>王五</name>
<age>30</age>
</Person>
</Persons>