xml数据解析
Pull解析方式
Pull是Android内置的xml解析器(在Android项目中使用Pull解析不需要导入jar包),Android内部的xml文件的解析都使用了Pull解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:
1)通过Xml这个工具类的.newPullParser()方式得到(在Android工程中可以使用)
2)通过XmlPullParserFactory工厂创建
读取到xml的声明返回数字0 START_DOCUMENT;
读取到xml的结束返回数字1 END_DOCUMENT ;
读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG
读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG
读取到xml的文本返回数字4 TEXT
test.xml文件
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
persons
>
<
person
id
=
"23"
>
<
name
>
liming
</
name
>
<
age
>
30
</
age
>
</
person
>
<
person
id
=
"20"
>
<
name
>
lixiangmei
</
name
>
<
age
>
25
</
age
>
</
person
>
</
persons
>
解析的java文件(创建的是java工程,所以需要导入xml2-2.3.0.jar,xmlpull_1_1_3_4c.jar,实体类Person省略,其中有id,name,age三个属性,只有setter和getter方法)
package com.hngd.xmldemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XmlDemo {
public static void main(String[] args) {
XmlDemo xml = new XmlDemo();
FileInputStream in;
try {
in = new FileInputStream(new File("D:\\eclipseWorkSpace\\JsonDemo\\src\\com\\hngd\\xmldemo\\test2.xml"));
List<Person> list = xml.parseXml(in);
System.out.println(list.get(0));
System.out.println(list.get(1));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private List<Person> parseXml(InputStream in){
List<Person> list = null;
Person person = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//获取Pull解析工厂
XmlPullParser xmlPullparser = factory.newPullParser();//获取XmlPullParser的实例
//XmlPullParser xmlPullparser = Xml.newPullParser(); //安卓工程中使用Xml工具获取Pull解析器
xmlPullparser.setInput(in,"UTF-8"); // 设置需要解析的XML数据
int eventType = xmlPullparser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){ //不是文档的结尾
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //1、文档开始。如果为开始解析头标签START_DOCUMENT,初始化数据
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //2、标签开始。如果为开始解析属性START_TAG,则获取数据
String name = xmlPullparser.getName(); //当前指向元素的名称(节点名称)
if("person".equals(name)){
person = new Person();
person.setId(Integer.parseInt(xmlPullparser.getAttributeValue(0)));
}
if(person!=null){
if("name".equals(name)){
person.setName(xmlPullparser.nextText());
}
if("age".equals(name)){
person.setAge(Integer.parseInt(xmlPullparser.nextText()));
}
}
break;
case XmlPullParser.END_TAG: //3、标签结束。当触发xml文档结束事件的名称为person(即解析结束位置),将封装对象放入集合,再将对象制空
if("person".equals(xmlPullparser.getName())){
list.add(person);
person = null;
}
break;
}
eventType = xmlPullparser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XmlDemo {
public static void main(String[] args) {
XmlDemo xml = new XmlDemo();
FileInputStream in;
try {
in = new FileInputStream(new File("D:\\eclipseWorkSpace\\JsonDemo\\src\\com\\hngd\\xmldemo\\test2.xml"));
List<Person> list = xml.parseXml(in);
System.out.println(list.get(0));
System.out.println(list.get(1));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private List<Person> parseXml(InputStream in){
List<Person> list = null;
Person person = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//获取Pull解析工厂
XmlPullParser xmlPullparser = factory.newPullParser();//获取XmlPullParser的实例
//XmlPullParser xmlPullparser = Xml.newPullParser(); //安卓工程中使用Xml工具获取Pull解析器
xmlPullparser.setInput(in,"UTF-8"); // 设置需要解析的XML数据
int eventType = xmlPullparser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){ //不是文档的结尾
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //1、文档开始。如果为开始解析头标签START_DOCUMENT,初始化数据
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //2、标签开始。如果为开始解析属性START_TAG,则获取数据
String name = xmlPullparser.getName(); //当前指向元素的名称(节点名称)
if("person".equals(name)){
person = new Person();
person.setId(Integer.parseInt(xmlPullparser.getAttributeValue(0)));
}
if(person!=null){
if("name".equals(name)){
person.setName(xmlPullparser.nextText());
}
if("age".equals(name)){
person.setAge(Integer.parseInt(xmlPullparser.nextText()));
}
}
break;
case XmlPullParser.END_TAG: //3、标签结束。当触发xml文档结束事件的名称为person(即解析结束位置),将封装对象放入集合,再将对象制空
if("person".equals(xmlPullparser.getName())){
list.add(person);
person = null;
}
break;
}
eventType = xmlPullparser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}