这篇博客主要用来介绍对XML文件的操作:解析与生成。
Android手机内部的解析就是pull解析
官网:http://xmlpull.org/
所谓的解析,我们可以理解为:利用XML文件的内容来生成一个对象
导出生成的xml文件后不要对其格式化,否则会出异常
1、MainActivity
package com.example.xmlparsertest1;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2、Person
package com.example.xmlparsertest1;
public class Person {
private Integer id;
private String name;
private Integer age;
public Person() {
// TODO Auto-generated constructor stub
}
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 + "]";
}
}
3、PersonService
package com.example.xmlparsertest1;
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文件
* @param in
* @return
* @throws Exception
*/
public List<Person> loadPersons(InputStream in) throws Exception{
XmlPullParser parser = Xml.newPullParser();//获取解析器
parser.setInput(in,"UTF-8");//指定输入流、码表
ArrayList<Person> persons = new ArrayList<Person>();
Person p = null;
/**
* parser.getName():获取标签的名字
* parser.getAttributeValue(0): 获取某个属性的值
* parser.next(): 让指针指向下一个标签
* parser.nextText(): 获取某个标签的文本内容
*/
for(int type = parser.getEventType() ; type != XmlPullParser.END_DOCUMENT ; type = parser.next()){
if(type == XmlPullParser.START_TAG){
if(parser.getName().equals("person")){
p = new Person();
String id = parser.getAttributeValue(0);//获取该标签的第0个属性的值(value)
// String id = parser.getAttributeValue(null, "id");//这样写也行。第一个参数是命名空间,第二个参数是属性的名字
p.setId(Integer.parseInt(id));
persons.add(p);
}else if(parser.getName().equals("name")){
String name = parser.nextText();
p.setName(name);
}else if(parser.getName().equals("age")){
String age = parser.nextText();
p.setAge(Integer.parseInt(age));
}
}
}
return persons;
}
//生成XML文件
public void savePersons(List<Person> persons,OutputStream out)throws Exception{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(out,"UTF-8");
serializer.startDocument("UTF-8", true);//开始文档
serializer.startTag(null, "persons");//开始标签
/**
* serializer.startDocument("UTF-8", true);//开始文档
* serializer.startTag(null, "persons");//开始标签
* serializer.attribute(null, "id", p.getId().toString());//设置属性
* serializer.text(p.getName());//设置标签的文本内容
* serializer.endTag(null, "persons");
* serializer.endDocument();
*/
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();
}
}
4、PersonServiceTest
package com.example.xmlparsertest1;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import android.os.Environment;
import android.test.AndroidTestCase;
public class PersonServiceTest extends AndroidTestCase {
public void testXMLParser() throws Exception{
PersonService service = new PersonService();
//获取src目录下的资源为输入流方法
InputStream in = PersonServiceTest.class.getClassLoader().getResourceAsStream("persons_hjd.xml");
List<Person> persons = service.loadPersons(in);
for(Person p : persons){
System.out.println( "----------->" + p);
}
// Person p = new Person(4, "hjd", 22);
// persons.add(p);
//
// service.savePersons(persons, new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + "persons_hjd.xml"));
}
}
以下附上需要解析的XML文件:persons.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>
源码下载:http://download.youkuaiyun.com/detail/caihongshijie6/7616863