Android解析xml和json格式数据
2015-11-29 13:21
766 查看
Android解析xml和json格式数据,首先我们搭建一个局域网服务器环境,比如我在局域网主机192.168.1.9中运行着nginx服务(nginx安装和配置),在html文件中存放着实现新建的两个文件get_data.xml和get_data.json作为测试文件。测试文件如下所示:
这个是json测试文件
这个是xml测试文件
Android需要使用网络权限,在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/send_xml"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send XML - Pull解析方式" />
<Button
android:id="@+id/send_json"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send JSON - JSONObject解析" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.StringReader;
public class MainActivity extends Activity implements View.OnClickListener {
private static final String TAG = "hdu";
public static final int SHOW_RESPONSE = 0;
private Button send_xml;
private Button send_json;
private TextView responseText;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_RESPONSE:
String response = (String) msg.obj;
// 更新UI界面
responseText.setText(response);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
send_xml = (Button) findViewById(R.id.send_xml);
send_json = (Button) findViewById(R.id.send_json);
responseText = (TextView) findViewById(R.id.response_text);
send_xml.setOnClickListener(this);
send_json.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_xml:
sendRequestWithHttpClient(1);
break;
case R.id.send_json:
sendRequestWithHttpClient(2);
break;
default:
break;
}
}
private void sendRequestWithHttpClient(final int mode) {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet;
// 指定访问的主机为局域网下主机
if (mode == 1) { // 获取xml格式数据
httpGet = new HttpGet("http://192.168.1.9/get_data.xml");
}
else { // 获取json格式数据
httpGet = new HttpGet("http://192.168.1.9/get_data.json");
}
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应成功
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
if (mode == 1) {
parseXMLWithPull(response);
}
else {
parseJSONWithJSONObject(response);
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSONObject(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
String result = "";
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
result += "id is " + id + "\n";
result += "name is " + name + "\n";
result += "version is " + version + "\n";
}
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = result;
handler.sendMessage(message);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int evnetType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
String result = "";
while (evnetType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (evnetType) {
// 开始解析某个节点
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)) {
id = xmlPullParser.nextText();
}
else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
}
else if ("version".equals(nodeName)) {
version = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)) {
result += "id is " + id + "\n";
result += "name is " + name + "\n";
result += "version is " + version + "\n";
}
break;
default:
break;
}
evnetType = xmlPullParser.next();
}
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = result;
handler.sendMessage(message);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
这个是json测试文件
这个是xml测试文件
Android需要使用网络权限,在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
activity_main.xml布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/send_xml"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send XML - Pull解析方式" />
<Button
android:id="@+id/send_json"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send JSON - JSONObject解析" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
MainActivity.java源码
package com.example.luoxn28.activity;import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.StringReader;
public class MainActivity extends Activity implements View.OnClickListener {
private static final String TAG = "hdu";
public static final int SHOW_RESPONSE = 0;
private Button send_xml;
private Button send_json;
private TextView responseText;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_RESPONSE:
String response = (String) msg.obj;
// 更新UI界面
responseText.setText(response);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
send_xml = (Button) findViewById(R.id.send_xml);
send_json = (Button) findViewById(R.id.send_json);
responseText = (TextView) findViewById(R.id.response_text);
send_xml.setOnClickListener(this);
send_json.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_xml:
sendRequestWithHttpClient(1);
break;
case R.id.send_json:
sendRequestWithHttpClient(2);
break;
default:
break;
}
}
private void sendRequestWithHttpClient(final int mode) {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet;
// 指定访问的主机为局域网下主机
if (mode == 1) { // 获取xml格式数据
httpGet = new HttpGet("http://192.168.1.9/get_data.xml");
}
else { // 获取json格式数据
httpGet = new HttpGet("http://192.168.1.9/get_data.json");
}
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应成功
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
if (mode == 1) {
parseXMLWithPull(response);
}
else {
parseJSONWithJSONObject(response);
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSONObject(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
String result = "";
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
result += "id is " + id + "\n";
result += "name is " + name + "\n";
result += "version is " + version + "\n";
}
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = result;
handler.sendMessage(message);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int evnetType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
String result = "";
while (evnetType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (evnetType) {
// 开始解析某个节点
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)) {
id = xmlPullParser.nextText();
}
else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
}
else if ("version".equals(nodeName)) {
version = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)) {
result += "id is " + id + "\n";
result += "name is " + name + "\n";
result += "version is " + version + "\n";
}
break;
default:
break;
}
evnetType = xmlPullParser.next();
}
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = result;
handler.sendMessage(message);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
参考资料
1、《第一行代码 Android》解析xml和json数据章节相关文章推荐
- XML 与 JSON 优劣对比
- VBA将excel数据表生成JSON文件
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- newtonsoft.json解析天气数据出错解决方法
- C#针对xml基本操作及保存配置文件应用实例
- Ruby程序中创建和解析XML文件的方法
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- vbs 解析json jsonp的方法
- SQL Server中的XML数据进行insert、update、delete
- Extjs4如何处理后台json数据中日期和时间
- C#实现将类的内容写成JSON格式字符串的方法