本讲继续讲解网络通信,通常我们在网络通信中都要使用到数据,且要结构化的数据。在结构化数据中,跨平台性、各语言对其解析比较好的主要有XML,JSON。
这讲,我们来讲讲XML
四、网络通信之获取结构化数据
4.1 获取XML
- 使用AsyncHttpClient和TextHttpResponseHandler获取文本数据
- 使用XmlPullParser和StringReader解析XML生成JavaBean
获取网络数据
public void getXml(View v) {
new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.xml", new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
List<Person> persons = parseXml(responseString);
for (Person p : persons)
System.out.println(p);
Toast.makeText(getApplicationContext(), "获取XML成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
// TODO Auto-generated method stub
}
});
}
解析XML数据
private List<Person> parseXml(String xml) {
List<Person> persons = new ArrayList<Person>();
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(xml));
Person p = null;
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) {
if (type == XmlPullParser.START_TAG) {
if ("person".equals(parser.getName())) { // 如果开始的是person, 创建对象, 获取id数据
String id = parser.getAttributeValue(0);
p = new Person();
p.setId(Integer.parseInt(id));
persons.add(p);
} else if ("name".equals(parser.getName())) { // 如果开始的是name, 获取下一个文本
String name = parser.nextText();
p.setName(name);
} else if ("age".equals(parser.getName())) { // 如果开始的是age, 获取下一个文本
String age = parser.nextText();
p.setAge(Integer.parseInt(age));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return persons;
}
4.2获取JSON
- 使用AsyncHttpClient和JsonHttpResponseHandler获取JSONArray
- 使用JSONArray和JSONObject解析JSON生成JavaBean
获取网络数据
public void getJson(View v) {
new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.js", new JsonHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, JSONArray arr) {
try {
for (int i = 0; i < arr.length(); i++) { // 遍历JSONArray
JSONObject obj = arr.getJSONObject(i); // 得到每一个JSONObject
int id = obj.getInt("id"); // 获取每个JSONObject中的数据, 封装成Person
String name = obj.getString("name");
int age = obj.getInt("age");
Person p = new Person(id, name, age);
System.out.println(p);
}
Toast.makeText(getApplicationContext(), "获取JSON成功!!!", Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
/*
new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.js", new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
List<Person> persons = parseJson(responseString);
for (Person p : persons)
System.out.println(p);
Toast.makeText(getApplicationContext(), "获取JSON成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
});
*/
}
解析JSON数据
@SuppressWarnings("unused")
private List<Person> parseJson(String json) {
List<Person> persons = new ArrayList<Person>();
try {
JSONArray arr = new JSONArray(json); // 把字符串封装成一个JSONArray
for (int i = 0; i < arr.length(); i++) { // 遍历JSONArray
JSONObject obj = arr.getJSONObject(i); // 得到每一个JSONObject
int id = obj.getInt("id"); // 获取每个JSONObject中的数据, 封装成Person
String name = obj.getString("name");
int age = obj.getInt("age");
Person p = new Person(id, name, age);
persons.add(p);
}
} catch (JSONException e) {
e.printStackTrace();
}
return persons;
}
示例源码->百度网盘