新闻客户端这个项目基本也快完成了,这基本上算是完全自己独立完成的第一个项目了,其中可以总结的东西还是很多的.许多东西总觉得自己掌握的不错,可实际用起来总觉得少点什么,不少看上去很简单的东西,也真的是需要不断地去加强记忆和理解,在学习新知识的同时,绝对不能落下了旧知识.刚好趁今天总结一下关于XML和JSON数据解析相关的一些东西,以后的工作和学习也一定会有不小的帮助.
##XML解析
###Java里常用的XML解析方式
在JavaWeb里常用的就三种解析:
- DOM解析
- 将xml文件解析为DOM树;不能加载大数据的xml文件;可以对xml文件进行CRUD.
- SAX解析
- 事件机制;效率很高;只能读取数据.
- DOM4J
- DOM和SAX的集合.可以解决上面两种解析各自的不足,同时兼具其优点,因此用的最广泛.
###android里XML解析
当然,在Android中,局限于硬件资源,上面的方式都不适合,Android里使用的是pull解析,当然也少不了通过对象模型生产XML文件的操作.
####生产XML文件
在开发里用的最多的就是处理对象集合,把对象集合以XML的形式保存起来.这里牵涉到两种形式的操作,序列化(Serializer,把内存中数据保存起来)和反序列化(把文件的内容读取到内存中).
可能用到以下方法:
- 获取生成工具: Xml.newSerializer()
- 设置输出流: setOutput()
- 开始文档: startDocument()
- 结束文档: endDocument()
- 开始标签: startTag()
- 结束标签: endTag()
- 属性: attribute()
- 文本: text()
示例:
首先创建一个对象模型:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class Dog {
public int id;
public String name;
public int age;
public Dog() {
super();
}
public Dog(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
然后将对象模型保存为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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
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) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void save(View v){
//把对象集合保存成xml 保存在sdcard
/**
* 1 构建对象集合
* 2 使用一个工具API对象集合保存成xml
* 3 保存在sdcard Environment 权限
*/
List<Dog> dogs = new ArrayList<Dog>();
for(int i = 0;i<5;i++){
dogs.add(new Dog(i, "哈巴狗"+i, 5+i));
}
try {
//获取xml序列化器
XmlSerializer serializer = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(), "dogs.xml");
FileOutputStream os = new FileOutputStream(file);
//指定输出流
serializer.setOutput(os, "utf-8");
//开始文档
serializer.startDocument("utf-8", true);
serializer.startTag(null, "dogs");
for(Dog dog:dogs){
serializer.startTag(null, "dog");
//属性
serializer.attribute(null, "id", dog.id+"");
//name标签
serializer.startTag(null, "name");
//文本值
serializer.text(dog.name);
serializer.endTag(null, "name");
//age标签
serializer.startTag(null, "age");
//文本值
serializer.text(dog.age+"");
serializer.endTag(null, "age");
serializer.endTag(null, "dog");
}
serializer.endTag(null, "dogs");
//结束文档
serializer.endDocument();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当然,最后一定不要忘记添加sdcard的访问权限.
####解析清单文件AndroidManifest.xml文件
首先,需要根据清单文件里的节点创建对象,MyActivityInfo,MyAppliactionInfo,MyIntentFilter,MyPackageInfo,MyUserSdk,当然,可能还会有其他的节点,这里只举个例子;
然后就是具体的解析了: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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68MyPackageInfo packageInfo = null;
MyUserSdk userSdk = null;
MyAppliactionInfo applicationInfo = null;
MyActivityInfo activityInfo = null;
MyIntentFilter intentFiler = null;
try {
// 解析器
XmlPullParser parser = Xml.newPullParser();
// 加载文件流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("Manifest.xml");
parser.setInput(inputStream, "UTF-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
String name = parser.getName();
if (name.equals("manifest")) {
// 包名
String packageName = parser.getAttributeValue(0);
int versionCode = Integer.parseInt(parser.getAttributeValue(1));
String versionName = parser.getAttributeValue(2);
packageInfo = new MyPackageInfo();
packageInfo.packageName = packageName;
packageInfo.versionCode = versionCode;
packageInfo.versionName = versionName;
} else if (name.equals("uses-sdk")) {
int minSdkVersion = Integer.parseInt(parser.getAttributeValue(0));
int targetSdkVersion = Integer.parseInt(parser.getAttributeValue(1));
userSdk = new MyUserSdk();
userSdk.minSdkVersion = minSdkVersion;
userSdk.targetSdkVersion = targetSdkVersion;
packageInfo.userSdk = userSdk;
} else if (name.equals("application")) {
String icon = parser.getAttributeValue(1).split("/")[1];
String label = parser.getAttributeValue(2).split("/")[1];
applicationInfo = new MyAppliactionInfo();
applicationInfo.icon = icon;
applicationInfo.lable = label;
packageInfo.applicationInfo = applicationInfo;
} else if (name.equals("activity")) {
String aname = parser.getAttributeValue(0);
String label = parser.getAttributeValue(1).split("/")[1];
activityInfo = new MyActivityInfo();
activityInfo.name = aname;
activityInfo.lable = label;
applicationInfo.activityInfo = activityInfo;
} else if (name.equals("intent-filter")) {
intentFiler = new MyIntentFilter();
activityInfo.intentFilter = intentFiler;
} else if (name.equals("action")) {
String action = parser.getAttributeValue(0);
intentFiler.action = action;
} else if (name.equals("category")) {
String category = parser.getAttributeValue(0);
intentFiler.category = category;
}
break;
case XmlPullParser.END_TAG:
break;
default:
break;
}
type = parser.next();
}
Log.i(TAG, packageInfo.toString());
} catch (Exception e) {
e.printStackTrace();
}
说实在话,关于pull解析,这些都是模板代码,只需要对于具体场景,直接往里面套就行了,真没什么好讲的…
##JSON解析
###Gson框架
说实话,Android里的JSON解析我是没搞明白,也没具体使用过,也确实非常的复杂,平时都是用的google提供的一个Gson框架来对JSON解析.
首先,说一下工作里用到的Gson解析吧.Gson框架用起来非常方便,刚好最在做的新闻客户端就用到Gson解析,就以新闻客户端里的JSON数据为例介绍一下吧:
根据JSON节点创建对象,这点跟XML那部分是一样的.必须要注意下面两点:
- 网络请求获取的JSON数据对应的对象模型
- 注意:所有的变量都必须与JSON的节点一一对应
使用Gson框架解析数据
1
2
3
4
5
6
7
8
9
10protected void analysisJSONData(String result) {
/**
* 使用Gson框架解析JSON数据
*/
Gson gson = new Gson();
NewsCenterBean mNewsCenterBean = gson.fromJson(result, NewsCenterBean.class);
//初始化侧滑菜单数据
List<MenuItem> menuItemsList = mNewsCenterBean.data;
((MainUI) mContext).getLeftMenuFragment();
}
OK,it’s over!创建对象成了唯一复杂的一部分,就是Android提供的JSON解析中最简单的一部分.
至于Android提供的JSON解析还是留待以后有需要的时候慢慢研究吧.