person.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>30</age>
</person>
<person id="20">
<name>李向梅</name>
<age>25</age>
</person>
</persons>
Person类:
public class Person {
private Integer id;
private String name;
private short age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public short getAge() {
return age;
}
public void setAge(short age) {
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}
业务bean
public static List<Person> readXml(InputStream inputStream)
throws Exception {
List<Person> persons=null;
// XMLPullParser对象
XmlPullParser parser = Xml.newPullParser();
//设置输入流和编码
parser.setInput(inputStream, "UTF-8");
// 文件开始代码
int eventCode = parser.getEventType();
Person person = null;
while (eventCode != XmlPullParser.END_DOCUMENT) {
switch (eventCode) {
//文档开始
case XmlPullParser.START_DOCUMENT:
// 初始化
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //开始标签
if ("person".equals(parser.getName())) {
person = new Person();
person.setId(Integer.parseInt(parser.getAttributeValue(0)));
}
else if(person!=null){
if ("name".equals(parser.getName())) {
//nextNext()如果下一个元素的内容是文本的时候适合用
person.setName(parser.nextText());
}
else if("age".equals(parser.getName())){
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG://结束标签
if ("person".equals(parser.getName()) && person!=null) {
persons.add(person);
person=null;//再掷为null
}
break;
}
// 下一个节点 www.2cto.com
eventCode = parser.next();
}
return persons;
}
现在解释下上面的东西,
XmlPullParser 只是个规范,可以到http://xmlpull.org/
里面主要的方法有
- //定义一个事件采用回调的方式,直到读取xml完毕。
- public
int getEventType() throws XmlPullParserException ; - //遍历下一个事件,返回一个事件的类型
- public
int next() throws XmlPullParserException, IOException - //得到当前Tag名字
- public
String getName(); - //获取文本
- public
String getText(); - //得到当前Tag下面的属性数量
- public
int getAttributeCount() ; - //得到当前Tag下面指定位置的属性名称
- public
String getAttributeName(int index); - //得到当前Tag下面指定位置的属性植
- public
String getAttributeValue(int index);
我们理解了XmlPullParser 可以自己实现一个XmlPullParser。不过java世界里好东西就是多。已经有人帮我们做了。
啊就是kxml。
这个API本身很简单。当时要把一个完整的wml解释并绘制在手机上还是要花相当的时间的。
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import lee.vo.Person;
public class XMLPullService {
public List<Person> readXML(InputStream inStream) throws Exception{
List<Person> persons = null;
Person person = null;
XmlPullParser pullParser = Xml.newPullParser();
//获取Pull解析器 Xml.newPullParser()添加一个pullParser解析器带命名空间的支持
pullParser.setInput(inStream, "UTF-8");
//设置Pull解析器进行解析的XML内容
int event = pullParser.getEventType(); //获取第一个事件
while(event!=XmlPullParser.END_DOCUMENT) //如果还不是结束文档事件,迭代每一个元素
{ switch (event)
{
case XmlPullParser.START_DOCUMENT: //开始文档事件
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //开始元素事件
if("person".equals(pullParser.getName()))
//pullParser.getName()得到当前指针所指向的节点的名称
{
person = new Person();
int id = new Integer(pullParser.getAttributeValue(0));
person.setId(id);
}
if(person!=null)
{
if("name".equals(pullParser.getName()))
{
String name = pullParser.nextText();
//得到当前节点下一个文本节点的内容------> <name>liming</name> 得到liming
person.setName(name);
}
else if("age".equals(pullParser.getName()))
{
String age = pullParser.nextText(); //获取下一个Text类型节点的值
person.setAge(new Short(age));
}
}
break;
case XmlPullParser.END_TAG: //结束元素事件
if("person".equals(pullParser.getName()))
{
persons.add(person);
person = null;
}
break;
}
event = pullParser.next(); //进入下一个元素并触发相应事件
}
return persons;
}
}