XML文件的生成与解析

我们知道SharedPreference背后是用XMl文件进行数据存储的,那么Android下是如何生成XMl文件,如何解析XML文件的呢?

转载请注明出处:http://shenshanlaoyuan.com/2016/05/16/Android/XML文件的生成与解析/

访问原文「XML文件的生成与解析」获取最佳阅读体验并参与讨论

生成XML文件

原始拼接的方法

假如要生成如下内容的XML文件

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<student>
<name>张三</name>
<number>123456</number>
<sex></sex>
</student>

那么拼接方式的代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
File file = new File(getFilesDir(),"张三.xml");
StringBuilder sb = new StringBuilder();
sb.append("<?xml version='1.0' encoding='utf-8'?>");
sb.append("<student>");
sb.append("<name>");
sb.append("张三");
sb.append("</name>");
sb.append("<number>");
sb.append("123456");
sb.append("</number>");
sb.append("<sex>");
sb.append("男");
sb.append("</sex>");
sb.append("</student>");
OutputStream out = new FileOutputStream(file);
out.write(sb.toString().getBytes());
out.close();

使用序列化器Serializer

如果XMl文件内接收的内容含有特殊字符,使用Serializer就不需要手动做判断转义了,自动帮我们完成了转义。

使用Serializer生成XMl代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
File file = new File(getFilesDir(),"张三.xml");
OutputStream out = new FileOutputStream(file);
// 专门生成xml 文件的 序列化器
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(out, "UTF-8");
// <?xml version="1.0" encoding="utf-8" standalone?>
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "student");
serializer.startTag(null, "name");
serializer.text("张三");
serializer.endTag(null, "name");
serializer.startTag(null, "number");
serializer.text("123456");
serializer.endTag(null, "number");
serializer.startTag(null, "sex");
serializer.text("男");
serializer.endTag(null, "sex");
serializer.endTag(null, "student");
serializer.endDocument();
out.close();

解析生成的XML文件

Android下使用的是Pull解析器,基于事件的。

假如下面是要解析的XML文件:

文件名称:persons.xml

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id=“18">
<name>allen</name>
<age>36</age>
</person>
<person id=“28">
<name>james</name>
<age>25</age>
</person>
</persons>!

定义了一个java bean用于存放上面解析出来的xml内容, 这个java bean为Person,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}
}

使用Pull解析器解析,解析出来的内容通过List集合返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
private List<Person> parserXmlFromLocal() {
try {
File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); //从SD卡中读取xml文件
FileInputStream fis = new FileInputStream(path);
// 获得pull解析器对象
XmlPullParser parser = Xml.newPullParser();
// 指定解析的文件和编码格式
parser.setInput(fis, "utf-8");
int eventType = parser.getEventType(); // 获得事件类型
List<Person> personList = null;
Person person = null;
String id;
while(eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName(); // 获得当前节点的名称
switch (eventType) {
case XmlPullParser.START_TAG: // 当前等于开始节点 <person>
if("persons".equals(tagName)) { // <persons>
personList = new ArrayList<Person>();
} else if("person".equals(tagName)) { // <person id="1">
person = new Person();
id = parser.getAttributeValue(null, "id");
person.setId(Integer.valueOf(id));
} else if("name".equals(tagName)) { // <name>
person.setName(parser.nextText());
} else if("age".equals(tagName)) { // <age>
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG: // </persons>
if("person".equals(tagName)) {
// 需要把上面设置好值的person对象添加到集合中
personList.add(person);
}
break;
default:
break;
}
eventType = parser.next(); // 获得下一个事件类型
}
return personList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

深山老猿 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
如对你有帮助,请我喝杯咖啡吧!0.0
显示 Gitment 评论