xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件。
- 读取Xml文件的内容
我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。<?xml version="1.0" encoding = "utf-8"?>
<persons>
<person id = "23">
<name>Jack</name>
<age>18</age>
</person>
<person id = "20">
<name>Tom</name>
<age>21</age>
</person>
</persons> 为了方便操作,我新建了一个Person类: public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ",name=" + name + ",age=" + age + "]";
}
public Person(int id,String name,int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
} 然后我又建了一个PersonService类,在这个类里面实现我们的操作。 public class PersonService {
/**
* 获取Xml文件的内容
* @param p_InputStream Xml文件输入流
* @return 包含Person信息的列表
* @throws Exception
*/
public static List<Person> getPersons(InputStream p_InputStream) throws Exception{
List<Person> persons = null;
Person person = null;
//得到XmlPullParse对象
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(p_InputStream,"utf-8");
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())){
person = new Person();
int id = new Integer(pullParser.getAttributeValue(0));
person.setId(id);
}
if("name".equals(pullParser.getName())){
String name = pullParser.nextText();
person.setName(name);
}
if("age".equals(pullParser.getName())){
int age = new Integer(pullParser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG :
if("person".equals(pullParser.getName())){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
/**
* 保存数据到XML文件中
* @param p_Person 数据列表
* @param p_Out 输出流
* @throws Exception 抛出异常
*/
public static void save(List<Person> p_Person,OutputStream p_Out) throws Exception{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(p_Out,"utf-8");
serializer.startDocument("utf-8",true);
serializer.startTag(null,"persons");
for(Person person:p_Person){
serializer.startTag(null,"person");
serializer.attribute(null,"id",person.getId()+"");
serializer.startTag(null,"name");
serializer.text(person.getName());
serializer.endTag(null,"name");
serializer.startTag(null,"age");
serializer.text(person.getAge()+"");
serializer.endTag(null,"age");
serializer.endTag(null,"person");
}
serializer.endTag(null,"persons");
serializer.endDocument();
p_Out.flush();
p_Out.close();
}
} 在这个类里面,我共定义了两个静态方法,一个用来读取Xml文件的内容,然后把信息放到一个列表中,另一个用来生成Xml文件,保存到手机中。 读取Xml的时候,我们需要先得到XmlPullParser的对象,利用Xml类的一个静态方法来得到:Xml.newPullParser(),然后我们把Xml文件输入流和XmlPullParse对象进行设置或者说是连接:pullParser.setInput(p_InputStream,"utf-8"),然后就开始解析Xml文件了。 解析的时候是逐行开始解析的,int event = pullParser.getEventType(),这行代码开始可能不理解,比方说,此时解析器解析的内容是<person id = "23">,那么此时event的值就是XmlPullParser.START_TAG,代表着开始标签,在代码中还有其他的一些值,END_TAG-->结束标签等等。根据event的值,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。
- 新建Xml文件,然后保存到手机上
新建Xml文件的时候,同样要使用封装类,XmlSerializer serializer = Xml.newSerializer(),这样,我们对XmlSerializer的对象进行操作,然后就可以把信息保存到手机上了。
下面是我MainActivity中的代码:
public class MainActivity extends Activity {
private TextView text;
StringBuilder sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
sb = new StringBuilder();
sb.append("源文件的内容n");
InputStream xml = getClass().getClassLoader().getResourceAsStream("data.xml");
try {
List<Person> persons = PersonService.getPersons(xml);
for(Person person:persons)
sb.append(person.toString()).append("n");
text.setText(sb);
} catch (Exception e) {}
sb.append("新建的文件的内容n");
List<Person> p = new ArrayList<Person>();
p.add(new Person(13,"lili",18));
p.add(new Person(23,"liufi",45));
File xmlFile = new File(getApplicationContext().getFilesDir(),"person.xml");
try {
OutputStream outputStream = new FileOutputStream(xmlFile);
PersonService.save(p,outputStream);
} catch (Exception e) {}
try {
xml = new FileInputStream(getApplicationContext().getFilesDir()+"/person.xml");
List<Person> persons = PersonService.getPersons(xml);
for(int i=0;i<persons.size();i++)
sb.append(persons.get(i).toString()).append("n");
text.setText(sb);
} catch (Exception e1) {}
}
}
写的
内容不多,代码倒是挺多的,因为内容比较基础,所以看看代码就可以明白解析的方式,多用用就可以很快的掌握了Pull解析器了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|