Android解析xml文件的时候,自己推荐是使用pull的方式来解析xml资源文件,pull方式又有两种,分别是XmlPullParser和XmlResourceParser两种。下面来分别介绍。
一: XmlPullParser方式进行布局解析。
首先看一下这个对象的数据读取方式:
parser.setInput(getResources().getAssets().open("student.xml"),
"UTF-8");
这里是以流的方式读取文件的,所以这个方法应该是多用在解析assets里面存放的资源文件,看具体完整代码,具体的解释在代码都已经注释:
public void parseWithoutResource() {
// 使用android.util.Xml类里面的静态方法Xml.newPullParser()新建一个xmlpullparser对象
XmlPullParser parser = Xml.newPullParser();
Student student = null;
// 给parser对象设置解析对象,它接收的是inputstream对象,所以要把文件以流的形式传进来,这里解析的是事先已经放到assets文件夹里面的xml文件。
try {
parser.setInput(getResources().getAssets().open("student.xml"),
"UTF-8");// 以UTF-8编码方式进行读取解析。
int eventType = parser.getEventType();
// 只要xml没有读取完毕就继续循环解析
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:// 文档解析开始
students = new ArrayList<Student>();
break;
case XmlPullParser.START_TAG:// 解析到标签处
if (tagName.equals("student")) {
student = new Student();
student.setId(parser.getAttributeValue("", "id"));// 第一个参数是属性前面的命名空间,后面是属性名
}
if (student != null) {
if (tagName.equals("name")) {
student.setName(parser.nextText());//当前标签后面的文字,也就是标签内容。
}
if (tagName.equals("age")) {
student.setAge(parser.nextText());
}
if (tagName.equals("sex")) {
student.setSex(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
if (tagName.equals("student")) {// 在标签结束的时候检查这个节点是不是student节点,如果是的话添加到list,赋值null,继续下一个student对象解析
students.add(student);
student = null;
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
二 : XmlResourceParser.
名字中的resource可以看出来,这个方法主要是解析资源文件里面的xml的,看以下构造方法:
XmlResourceParser parser = getResources().getLayout(resId);
这个是通过资源文件的id读取xml文件并进行解析,以下看具体代码:
public JSONArray parseWithResource(int resId) {
JSONArray array = new JSONArray();
JSONObject item = null;
// 正如函数名称一样,xml资源解析,用来解析资源文件里面的xml,获取到项目中资源之后再获取layout进行解析
XmlResourceParser parser = getResources().getLayout(resId);
try {
// 获取当前解析到的标签类型
int eventType = parser.getEventType();
while (eventType != XmlResourceParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (eventType) {
case XmlResourceParser.START_TAG:
// 这个名字的方法名可以看出来,获取的是资源的值,也就是对用的值在R文件里面对应的整型值。
int id = parser.getAttributeResourceValue(NAME_SPACE, "id",
-1);
item = new JSONObject();
if (id != -1) {
if (getViewById(id) != null) {
item.put("id", id);
item.put("tagName", tagName);
// 不带resource的getAttributeValue直接获取属性值,第一个参数是命名空间,第二个是属性名,返回属性值。
String width = parser.getAttributeValue(NAME_SPACE,
"layout_width");
String height = parser.getAttributeValue(
NAME_SPACE, "layout_height");
String text = parser.getAttributeValue(NAME_SPACE,
"text");
item.put("width", width);
item.put("height", height);
item.put("text", text);
array.put(item);
}
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return array;
}