用AsyncHttpClient访问xml页面

使用开源框库AsyncHttpClient

1、在app的build.gradle中的dependencies中添加:

compile 'net.callumtaylor:asynchttpclient:1.5'

2、如果出现错误的话,有几种情况,一种是
这里写图片描述
这种情况,在app的build.gradle中添加:

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

如果是
这里写图片描述

这种属于本机没有安装sdk 19,去sdk Manager去下载

3、AsyncHttpClient本身有访问图片、json等的封装好的方法,访问xml页面的话等同于访问一个文本界面,使用StringResponseHandlergetContent()返回的就是这个xml文本

访问及xml解析

访问一个天气预报的界面,Log打印相关信息
北京天气预报

public class MainActivity extends AppCompatActivity {
    private String response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AsyncHttpClient asyncHttpClient = new AsyncHttpClient("http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100");
        asyncHttpClient.get(new StringResponseHandler() {
            @Override
            public void onSuccess() {
                response = getContent();
            }
        });
        findViewById(R.id.btnPull).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                parseXmlWithPull(response);
            }
        });
        findViewById(R.id.btnSAX).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                parseXmlWithSAX(response);
            }
        });
    }

    /**
     * pull解析
     * @param response
     */
    private void parseXmlWithPull(String response) {
        try {
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
            xmlPullParser.setInput(new StringReader(response));
            int eventType = xmlPullParser.getEventType();
            String date = "";
            String high = "";
            String low = "";
            String type = "";
            String fengxiang = "";
            String fengli = "";
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if ("date".equals(nodeName)) {
                            date = xmlPullParser.nextText();
                        }
                        if ("high".equals(nodeName)) {
                            high = xmlPullParser.nextText();
                        }
                        if ("low".equals(nodeName)) {
                            low = xmlPullParser.nextText();
                        }
                        if ("type".equals(nodeName)) {
                            type = xmlPullParser.nextText();
                        }
                        if ("fengxiang".equals(nodeName)) {
                            fengxiang = xmlPullParser.nextText();
                        }
                        if ("fengli".equals(nodeName)) {
                            fengli = xmlPullParser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("weather".equals(nodeName)) {
                            Log.d("jackie", "date:----------------" + date);
                            Log.d("jackie", "high:----------------" + high);
                            Log.d("jackie", "low:-----------------" + low);
                            Log.d("jackie", "type:-----------------" + type);
                            Log.d("jackie", "fengxiang:-----------------" + fengxiang);
                            Log.d("jackie", "fengli:-----------------" + fengli);
                        }
                        break;
                    default:
                        break;
                }
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SAX解析,需要用到自定义的WeatherHandler
     * @param response
     */
    private void parseXmlWithSAX(String response) {
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        try {
            XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
            WeatherHandler weatherHandler = new WeatherHandler();
            xmlReader.setContentHandler(weatherHandler);
            xmlReader.parse(new InputSource(new StringReader(response)));
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/**
 * Created by Law on 2015/11/27.
 */
public class WeatherHandler extends DefaultHandler {
    private String nodeName;
    private StringBuilder date;
    private StringBuilder high;
    private StringBuilder low;
    private StringBuilder type;
    private StringBuilder fengxiang;
    private StringBuilder fengli;

    @Override
    public void startDocument() throws SAXException {
        date = new StringBuilder();
        high = new StringBuilder();
        low = new StringBuilder();
        type = new StringBuilder();
        fengxiang = new StringBuilder();
        fengli = new StringBuilder();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        nodeName = localName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (nodeName.equals("date")) {
            date.append(ch, start, length);
        }
        if (nodeName.equals("high")) {
            high.append(ch, start, length);
        }
        if (nodeName.equals("low")) {
            low.append(ch, start, length);
        }
        if (nodeName.equals("type")) {
            type.append(ch, start, length);
        }
        if (nodeName.equals("fengxiang")) {
            fengxiang.append(ch, start, length);
        }
        if (nodeName.equals("fengli")) {
            fengli.append(ch, start, length);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("weather".equals(localName)) {
            Log.d("jackie", "date:----------------" + date.toString().trim());
            Log.d("jackie", "high:----------------" + high.toString().trim());
            Log.d("jackie", "low:-----------------" + low.toString().trim());
            Log.d("jackie", "type:-----------------" + type.toString().trim());
            Log.d("jackie", "fengxiang:-----------------" + fengxiang.toString().trim());
            Log.d("jackie", "fengli:-----------------" + fengli.toString().trim());
            //最后清空StringBuilder
            date.setLength(0);
            high.setLength(0);
            low.setLength(0);
            type.setLength(0);
            fengxiang.setLength(0);
            fengli.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值