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