您的位置:首页 > 移动开发 > Android开发

Android下Xml解析技术(三)、pull解析Xml文件

2015-09-27 23:01 656 查看

转载/article/2232744.html

Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。

官网:http://www.xmlpull.org

Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。
而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next()
方法提取它们(主动提取事件)。
Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。
下面看看pull技术具体如何解析xml文件。

依然是解析这个简单的文件:

[java]
view plaincopyprint?

<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>Lucy</name> <age>15</age> </person> <person id="2"> <name>Tim</name> <age>20</age> </person> </persons>

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>Lucy</name>
<age>15</age>
</person>
<person id="2">
<name>Tim</name>
<age>20</age>
</person>
</persons>


解析代码:

[java]
view plaincopyprint?

public void pullParseXml() throws XmlPullParserException, IOException {
// 构建解析器
XmlPullParser parser = Xml.newPullParser();
// 获得xml文件的输入流,获得文档对象
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
parser.setInput(inputStream, "UTF-8");

//开始解析
int eventType=parser.getEventType();//产生第一个事件
List<Person> persons=null;
Person person=null;

while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件 文档结束
switch (eventType) {//判断事件的类型
case XmlPullParser.START_DOCUMENT: //开始文档
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //开始元素节点
String name1=parser.getName();//获 取解析器当前指向元素节点的名称
if("person".equals(name1)){//如果指向person节点
person=new Person();
person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值
}else if ("name".equals(name1)) {
person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值
}else if ("age".equals(name1)) {
person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值
}
break;
case XmlPullParser.END_TAG://结束元素节点
String name2=parser.getName();
if("person".equals(name2)){//如果指向/person节点
persons.add(person);
person=null;
}
break;
}
eventType=parser.next();//解析器向下移动一个单位
}
for (Person p : persons) {
System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());
}
}

public void pullParseXml() throws XmlPullParserException, IOException {
// 构建解析器
XmlPullParser parser = Xml.newPullParser();
// 获得xml文件的输入流,获得文档对象
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
parser.setInput(inputStream, "UTF-8");

//开始解析
int eventType=parser.getEventType();//产生第一个事件
List<Person> persons=null;
Person person=null;

while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件  文档结束
switch (eventType) {//判断事件的类型
case XmlPullParser.START_DOCUMENT: //开始文档
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:  //开始元素节点
String name1=parser.getName();//获 取解析器当前指向元素节点的名称
if("person".equals(name1)){//如果指向person节点
person=new Person();
person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值
}else if ("name".equals(name1)) {
person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值
}else if ("age".equals(name1)) {
person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值
}
break;
case XmlPullParser.END_TAG://结束元素节点
String name2=parser.getName();
if("person".equals(name2)){//如果指向/person节点
persons.add(person);
person=null;
}
break;
}
eventType=parser.next();//解析器向下移动一个单位
}
for (Person p : persons) {
System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: