XML是一种常用的数据存储方式,在Android平台内部很多地方都使用了XML存储,轻量级的SharedPreferences 类的存储就使用了XML文件。
XML解析主要有三种方式,SAX ,DOM, 和Android自带的PULL解析器解析XML文件。
常规在PC使用DOM相对轻松,对一些性能敏感的数据库或手机主要采用SAX方式,SAX读取是单向的,优点是不占用空间,属性解析方便,但对于嵌套多个分支来说不是很方便,而DOM方式会把整个XML文件加载到内存中去,优点是可以任意读取节点,但是消耗内存
而PULL常用于移动设备,节省内存。
PULL解析原理:
PULL解析器与SAX解析器相似,它提供了类似的事件,如:开始元素和结束元素事件,使用parse.next()可以进入下一个,元素并触发响应的事件,事件将作为数值代码发送,因此可以使用一个switch对感兴趣的事件进行处理,当元素开始解析时,调用parser.nextText ()方法可以获取下一个Text类型元素的值。
实例如下:
1:创建一个XML文件如下,该文件存放于 (res/ raw/person.xml):
<condingke>
<person personid= "1">
<name>杨</name>
<age>22</age>
<sex>男</sex>
<tel>18829290900</tel>
</person>
<person personid= "2">
<name>李</name>
<age>18</age>
<sex>女</sex>
<tel>18829296666</tel>
</person>
</condingke>
2:创建一个类,包含上面xml中的属性生成toString方法即可
主程序:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
// 使用PULL解析XML文件
public void pullparse_Click (View view){
ArrayList<Person> list =Parser();
for (int i = 0 ;i<list.size();i++){
System.out.println(list.get(i));
}
}
private ArrayList<Person> Parser() {
Person p = null;
ArrayList<Person> list = new ArrayList<>();// 创建PULL解析器
XmlPullParser pullParser = Xml.newPullParser();
//获取xml资源
InputStream in =getResources().openRawResource(R.raw.person);
try {
// 设置要解析的流
pullParser.setInput(in, "UTF-8");
// 获取当前的事件类型
int eventType=pullParser.getEventType();
// 根据事件类型来解析
while (eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
//读到开始标记
case XmlPullParser.START_TAG :
// 获取标记名
String tag= pullParser.getName();
if ("person".equals(tag)){
p = new Person();
// getAttributeValue返回值类型为String虚需强制类型转换
p.personid =Integer.parseInt(pullParser.getAttributeValue(null,"personid"));
} else if ("name".equals(tag)){
p.name=pullParser.nextText();
}else if ("age".equals(tag)){
p.age= Integer.parseInt(pullParser.nextText());
}else if ("sex".equals(tag)){
p.sex=pullParser.nextText();
}else if ("tel".equals(tag)){
p.tel=pullParser.nextText();
}
break;
//每次读完一个标签判断然后将其存储起来
case XmlPullParser.END_TAG:
if ("person".equals(pullParser.getName())){
list.add(p); //添加到list中保存
}
break;
}
//获取下一事件类型(循环读取)
eventType=pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return list;
}
}