好久没有写日志了,写写日志复习一下android基础知识了:
在android中我们一般采取pool解析,至于为何不使用其他两种方法,前面的日志中的xml的三种解析方式中有,最关键的还是资源利用效率问题了。
贴代码上注释吧:
我们这里解析下面这个xml
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
<person id="1">
<name>范冰冰</name>
<age>31</age>
</person>
<person id="2">
<name>林志玲</name>
<age>38</age>
</person>
<person id="3">
<name>杨幂</name>
<age>26</age>
</person>
</persons>
第一步,解析xml必须有一个解析器和一个xml文件(xml文件我们称其为流)
XmlPullParser parser = Xml.newPullParser(); // 获取解析器
parser.setInput(in, "UTF-8"); // 设置输入流
特别需要注意的一点:pull解析需要我们手动的去 执行next parser.next()
还有其中的几个事件:
START_DOCUMENT END_DOCUMENT对应的是根节点。
START_TAG END_TAG 对应的是标签名。
获取到需要的标签名后就可以获取它下面的属性了parser.getName()
再看下面的代码就不会吃力了哦。
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) { // 循环解析
if (type == XmlPullParser.START_TAG) { // 判断如果遇到开始标签事件
if ("person".equals(parser.getName())) { // 标签名为person
p = new Person(); // 创建Person对象
String id = parser.getAttributeValue(0); // 获取属性
p.setId(Integer.parseInt(id)); // 设置ID
persons.add(p); // 把Person对象装入集合
} else if ("name".equals(parser.getName())) { // 标签名为name
String name = parser.nextText(); // 获取下一个文本
p.setName(name); // 设置name
} else if ("age".equals(parser.getName())) { // 标签名为age
String age = parser.nextText(); // 获取下一个文本
p.setAge(Integer.parseInt(age)); // 设置age
}
}
}
下面一个小工程,很能说明问题,有疑问的朋友看下
javabean :person.java
package com.helloandroid.xml;
public class Person {
private Integer id;
private String name;
private Integer age;
public Person() {
super();
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
业务代码:PersonService.java
package com.helloandroid.xml;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
public class PersonService {
/**
* 接收一个包含XML文件的输入流, 解析出XML中的Person对象, 装入一个List返回
* @param in 包含XML数据的输入流
* @return 包含Person对象的List集合
*/
public List<Person> getPersons(InputStream in) throws Exception {
XmlPullParser parser = Xml.newPullParser(); // 获取解析器
parser.setInput(in, "UTF-8"); // 设置输入流
List<Person> persons = new ArrayList<Person>();
Person p = null;
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) { // 循环解析
if (type == XmlPullParser.START_TAG) { // 判断如果遇到开始标签事件
if ("person".equals(parser.getName())) { // 标签名为person
p = new Person(); // 创建Person对象
String id = parser.getAttributeValue(0); // 获取属性
p.setId(Integer.parseInt(id)); // 设置ID
persons.add(p); // 把Person对象装入集合
} else if ("name".equals(parser.getName())) { // 标签名为name
String name = parser.nextText(); // 获取下一个文本
p.setName(name); // 设置name
} else if ("age".equals(parser.getName())) { // 标签名为age
String age = parser.nextText(); // 获取下一个文本
p.setAge(Integer.parseInt(age)); // 设置age
}
}
}
return persons;
}
public void writePersons(List<Person> persons, OutputStream out) throws Exception {
XmlSerializer serializer = Xml.newSerializer(); // 获取XML序列化工具
serializer.setOutput(out, "UTF-8"); // 设置输出流
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for (Person p : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", p.getId().toString());
serializer.startTag(null, "name");
serializer.text(p.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(p.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
}
}
测试代码:PersonServiceTest.java
package com.helloandroid.xml;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import android.test.AndroidTestCase;
public class PersonServiceTest extends AndroidTestCase {
public void testGetPersons() throws Exception {
PersonService service = new PersonService();
InputStream in = PersonService.class.getClassLoader().getResourceAsStream("persons.xml");
List<Person> persons = service.getPersons(in);
in.close();
for (Person p : persons) {
System.out.println(p);
}
Person p = new Person(4, "xiaoxu", 18);
persons.add(p);
FileOutputStream fos = new FileOutputStream("/mnt/sdcard/persons.xml");
service.writePersons(persons, fos);
fos.close();
}
}