ANDROID 中的xml解析

好久没有写日志了,写写日志复习一下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();
}


}


你可能感兴趣的:(ANDROID 中的xml解析)