1、代码中已有详细注释,代码如下:
private void sendRequestWithOkHttp() {
//开启线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient();
//要发起一个http请求,首先创建一个Request对象
Request request=new Request.Builder().url("http://123.206.81.238:8080/xiaomatext/get_data.xml").build();
//调用Okhttp的newCall方法返回根据request请求,服务器返回的数据
Response response=client.newCall(request).execute();
//得到服务器返回的数据的详细内容
String responseData=response.body().string();
//使用pull方法将解析xml数据
parseXMLWithPull(responseData);
// //展示服务器返回的数据到界面上
// showResponse(responseData.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithPull(String xmlData) {
try {
//首先获取一个XmlPullParseFactory实例
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
//借助上面的实例得到XmlPullParse对象
XmlPullParser xmlPullParser=factory.newPullParser();
//将服务器返回的xml数据设置进来进行解析
xmlPullParser.setInput(new StringReader(xmlData));
//通过getEventType可以得到当前的解析事件
int eventType=xmlPullParser.getEventType();
String id="";
String name="";
String version="";
//在循环中不断解析
while (eventType!=XmlPullParser.END_DOCUMENT){
//通过xmlpullparse的getname方法得到当前节点的名字
String nodeName=xmlPullParser.getName();
switch (eventType){
//开始解析某个节点
case XmlPullParser.START_TAG:
//如果当前节点的名字等于id,name或者version
//调用xmlpullparse的nextText方法获取节点的具体内容
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:
//解析完一个app后打印出来
if ("app".equals(nodeName)){
Log.d("MainActivity","id is"+id);
Log.d("MainActivity","name is"+name);
Log.d("MainActivity","version is"+version);
}
break;
default:
break;
}
//如果没有解析完,调用next方法继续解析
eventType=xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
2、总结通过Pull解析xml数据的步骤如下:
i:首先获取服务器返回的数据,这里采用OkHttp进行网络传输
ii:得到服务器数据后,不直接进行展示,调用parseXMLWithPull方法进行解析XML数据。
iii:获取一个xmlPullParseFactory实例,并借助这个实例得到xmlPullParse对象。
iv:调用xmlPullParse的setInput方法将服务器返回的数据设置进去进行解析。
v:通过循环进行数据的解析。