您的位置:首页 > 移动开发 > Android开发

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" />

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数据章节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息