package com.zjw.mynetwork4;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.StringReader;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
//9.3 p321 解析XML格式数据
//准备一个本地服务器(这里用的tomcat),在里面准备一个xml文件,
//可在浏览器直接访问:http://localhost:8080/get_data.xml
//注意:http与https的区别,可参考:http://zhinan.sogou.com/guide/detail/?id=1610015270 http与https的区别
//代码如下:
/*
get_data.xml
<apps>
<app>
<id>1</id>
<name>Google Maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Google Play</name>
<version>2.3</version>
</app>
</apps>
*/
//9.3.1 324 Pull解析方式
//解析XML格式数据书里介绍了Pull解析和SAX解析
//前面0kHttp的代码拷一份过来(笔记(8)),在那个基础上修改
//url:http://10.0.2.2:8080/get_data.xml
/*
解析过程:
1.获取工厂XmlPullParserFactory实例
2.通过工厂获取XmlPullParser实例
3.调用setInput()把流设置给它
4.调用getEventType()得到当前的解析事件,判断有没有到达末尾
5.while循环中不断地进行解析
通过getName()获取当前节点名字
调用nextText()获取节点具体内容
*/
public class AnalysisOfXML extends AppCompatActivity {
private Button mBtnSendRequest;
private TextView mTvResponseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_analysis_of_xml);
//找到控件
mBtnSendRequest = (Button) findViewById(R.id.btn_send_request);
mTvResponseText = (TextView) findViewById(R.id.tv_response_text);
//Button点击事件,发送HTTP请求
mBtnSendRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//用OkHttp发送HTTP请求
sendRequestWithOkHttp();
}
});
}
private void sendRequestWithOkHttp() {
//开启新线程做耗时操作
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();//创建一个OkHttpClient实例
Request request = new Request.Builder()
.url("http://10.0.2.2:8080/get_data.xml")//设置目标网络地址
.build();//创建一个Request对象
Response response = client.newCall(request).execute();//发送请求获取服务器返回对象
String responseData = response.body().string();
//解析XML
parseXMLWithPull(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithPull(String responseData) {
StringBuilder builder = new StringBuilder();
try {
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();//创建工厂
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();//创建XmlPullParser实例
xmlPullParser.setInput(new StringReader(responseData));
int eventType = xmlPullParser.getEventType();//得到当前的解析事件
String id = "";
String name = "";
String version = "";
while (eventType != xmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();//获取当前节点名字
switch (eventType) {
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)) {
builder.append("id:" + id + "\n")
.append("name:" + name + "\n")
.append("version:" + version + "\n")
.append("-----------------------------\n");
}
break;
default:
break;
}
eventType = xmlPullParser.next();//获取下一个解析事件
}
showResponse(builder.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
//将数据设置给TextView
private void showResponse(final String s) {
//在UI线程(主线程)更新UI,因为Android不允许在子线程中进行UI操作
runOnUiThread(new Runnable() {
@Override
public void run() {
mTvResponseText.setText(s);
}
});
}
}
转载于:https://my.oschina.net/u/3620480/blog/1489153
本文介绍如何利用OkHttp发起HTTP请求,并使用Pull解析方式处理服务器返回的XML数据。通过示例代码详细展示了从创建OkHttpClient实例到解析XML节点的具体步骤。
8280

被折叠的 条评论
为什么被折叠?



