《第一行代码》笔记(9)——XML的Pull解析方式

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值