美文网首页
Retrofit2解析天气API XML接口

Retrofit2解析天气API XML接口

作者: 奈蜇 | 来源:发表于2018-07-25 17:32 被阅读0次

栗子:

话不多说直接讲例子吧,天气API XML返回方式,链接为:https://www.sojson.com/open/api/weather/xml.shtml?city=北京

友情提示:这是本人初次接触的记录篇,有坑是正常现象,欢迎指出。

具体返回格式:
<?xml version="1.0" encoding="UTF-8"?>
<resp>
    <city>北京</city>
    <updatetime>13:35</updatetime>
    <wendu>29</wendu>
    <fengli>4级</fengli>
    <shidu>28%</shidu>
    <fengxiang>南风</fengxiang>
    <sunrise_1>04:59</sunrise_1>
    <sunset_1>19:23</sunset_1>
    <sunrise_2></sunrise_2>
    <sunset_2></sunset_2>
    <environment>
        <aqi>72</aqi>
        <pm25>52</pm25>
        <suggest>极少数敏感人群应减少户外活动</suggest>
        <quality>良</quality>
        <MajorPollutants>颗粒物(PM2.5)</MajorPollutants>
        <o3>162</o3>
        <co>1</co>
        <pm10>90</pm10>
        <so2>9</so2>
        <no2>33</no2>
        <time>13:00:00</time>
    </environment>
    <alarm>
        <cityKey>10101</cityKey>
        <cityName>
            <![CDATA[北京市]]>
        </cityName>
        <alarmType>
            <![CDATA[森林火险]]>
        </alarmType>
        <alarmDegree>
            <![CDATA[橙色]]>
        </alarmDegree>
        <alarmText>
            <![CDATA[北京市气象台发布森林火险橙色预警]]>
        </alarmText>
        <alarm_details>
            <![CDATA[市森防办与市气象台于5月5日至15日联合发布森林火险橙色预警:5日有5级偏北风,阵风达7、8级;6-15日有3、4级偏北风,阵风达6级,气温高、空气干燥,湿度较小。请广大市民注意森林防火,森林火灾报警电话12119。]]>
        </alarm_details>
        <standard/>
        <suggest/>
        <imgUrl>
            <![CDATA[]]>
        </imgUrl>
        <time>2017-05-04 19:30:00</time>
    </alarm>
    <yesterday>
        <date_1>15日星期一</date_1>
        <high_1>高温 28℃</high_1>
        <low_1>低温 15℃</low_1>
        <day_1>
            <type_1>晴</type_1>
            <fx_1>南风</fx_1>
            <fl_1>微风</fl_1>
        </day_1>
        <night_1>
            <type_1>多云</type_1>
            <fx_1>南风</fx_1>
            <fl_1>微风</fl_1>
        </night_1>
    </yesterday>
    <forecast>
        <weather>
            <date>16日星期二</date>
            <high>高温 32℃</high>
            <low>低温 17℃</low>
            <day>
                <type>多云</type>
                <fengxiang>南风</fengxiang>
                <fengli>3-4级</fengli>
            </day>
            <night>
                <type>晴</type>
                <fengxiang>西北风</fengxiang>
                <fengli>微风级</fengli>
            </night>
        </weather>
        <weather>
            <date>17日星期三</date>
            <high>高温 34℃</high>
            <low>低温 19℃</low>
            <day>
                <type>晴</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </day>
            <night>
                <type>晴</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </night>
        </weather>
        <weather>
            <date>18日星期四</date>
            <high>高温 35℃</high>
            <low>低温 22℃</low>
            <day>
                <type>晴</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </day>
            <night>
                <type>多云</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </night>
        </weather>
        <weather>
            <date>19日星期五</date>
            <high>高温 35℃</high>
            <low>低温 22℃</low>
            <day>
                <type>多云</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </day>
            <night>
                <type>晴</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </night>
        </weather>
        <weather>
            <date>20日星期六</date>
            <high>高温 34℃</high>
            <low>低温 21℃</low>
            <day>
                <type>晴</type>
                <fengxiang>南风</fengxiang>
                <fengli>3-4级</fengli>
            </day>
            <night>
                <type>多云</type>
                <fengxiang>南风</fengxiang>
                <fengli>微风级</fengli>
            </night>
        </weather>
    </forecast>
    <zhishus>
        <zhishu>
            <name>晨练指数</name>
            <value>较适宜</value>
            <detail>早晨气象条件较适宜晨练,但风力稍大,晨练时请注意选择避风的地点,避免迎风锻炼。</detail>
        </zhishu>
        <zhishu>
            <name>舒适度</name>
            <value>较不舒适</value>
            <detail>白天天气多云,同时会感到有些热,不很舒适。</detail>
        </zhishu>
        <zhishu>
            <name>穿衣指数</name>
            <value>炎热</value>
            <detail>天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。</detail>
        </zhishu>
        <zhishu>
            <name>感冒指数</name>
            <value>少发</value>
            <detail>各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。</detail>
        </zhishu>
        <zhishu>
            <name>晾晒指数</name>
            <value>适宜</value>
            <detail>天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!</detail>
        </zhishu>
        <zhishu>
            <name>旅游指数</name>
            <value>适宜</value>
            <detail>天气较好,温度稍高,幸好风稍大,会缓解稍热的天气。适宜旅游,可不要错过机会呦!</detail>
        </zhishu>
        <zhishu>
            <name>紫外线强度</name>
            <value>中等</value>
            <detail>属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。</detail>
        </zhishu>
        <zhishu>
            <name>洗车指数</name>
            <value>较适宜</value>
            <detail>较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。</detail>
        </zhishu>
        <zhishu>
            <name>运动指数</name>
            <value>较适宜</value>
            <detail>天气较好,但风力较大,推荐您进行室内运动,若在户外运动请注意防风。</detail>
        </zhishu>
        <zhishu>
            <name>约会指数</name>
            <value>较不适宜</value>
            <detail>天气较好,且室外有风,外出约会可能会让恋人受些苦,最好在温暖的室内促膝谈心。</detail>
        </zhishu>
        <zhishu>
            <name>雨伞指数</name>
            <value>不带伞</value>
            <detail>天气较好,不会降水,因此您可放心出门,无须带雨伞。</detail>
        </zhishu>
    </zhishus>
</resp>
<!-- 10.10.156.163(10.10.156.163):33961 ; 10.10.162.42:8080 -->

错误回调:

<?xml version="1.0" encoding="UTF-8"?>
<resp>
<status>400</status>
<error>Check the parameters.</error>
</resp>
<!--  20180725 17:52:29:029  -->

步骤一:

导包:

 api 'com.squareup.retrofit2:retrofit:2.4.0'
 api 'com.squareup.retrofit2:converter-simplexml:2.4.0'

要最新的请访问 http://square.github.io/retrofit/

步骤二:

开始解析创建对象,要解析你就得先完成这步,不然你解析成空气啊。

完全解析:

这边为了省事直接写在一个文件中了,然后有点长,但这是为了方便你们Copy.
注意事项:解析对象不能是内部类

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;

/**
 * Created by 奈蜇 on 2018-07-25.
 * RespWeather 
 */
@Root(name = "resp",strict = false)
public class RespWeather {
    @Element(name = "city",required = false)
    String city;
    @Element(name = "updatetime",required = false)
    String updatetime;
    @Element(name = "wendu",required = false)
    int wendu;
    @Element(name = "fengli",required = false)
    String fengli;
    @Element(name = "shidu",required = false)
    String shidu;
    @Element(name = "fengxiang",required = false)
    String fengxiang;
    @Element(name = "sunrise_1",required = false)
    String sunrise_1;
    @Element(name = "sunset_1",required = false)
    String sunset_1;
    @Element(name = "sunrise_2",required = false)
    String sunrise_2;
    @Element(name = "sunset_2",required = false)
    String sunset_2;
    @Element(name = "environment",required = false)
    Environment environment;
    @Element(name = "alarm",required = false)
    Alarm alarm;
    @Element(name = "yesterday",required = false)
    Yesterday yesterday;
    @Element(name = "forecast",required = false)
    Forecast forecast;
    @Element(name = "zhishus",required = false)
    Zhishus zhishus;
    @Element(name = "status",required = false)
    int status;
    @Element(name = "error",required = false)
    String error;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getUpdatetime() {
        return updatetime;
    }

    public void setUpdatetime(String updatetime) {
        this.updatetime = updatetime;
    }

    public int getWendu() {
        return wendu;
    }

    public void setWendu(int wendu) {
        this.wendu = wendu;
    }

    public String getFengli() {
        return fengli;
    }

    public void setFengli(String fengli) {
        this.fengli = fengli;
    }

    public String getShidu() {
        return shidu;
    }

    public void setShidu(String shidu) {
        this.shidu = shidu;
    }

    public String getFengxiang() {
        return fengxiang;
    }

    public void setFengxiang(String fengxiang) {
        this.fengxiang = fengxiang;
    }

    public String getSunrise_1() {
        return sunrise_1;
    }

    public void setSunrise_1(String sunrise_1) {
        this.sunrise_1 = sunrise_1;
    }

    public String getSunset_1() {
        return sunset_1;
    }

    public void setSunset_1(String sunset_1) {
        this.sunset_1 = sunset_1;
    }

    public String getSunrise_2() {
        return sunrise_2;
    }

    public void setSunrise_2(String sunrise_2) {
        this.sunrise_2 = sunrise_2;
    }

    public String getSunset_2() {
        return sunset_2;
    }

    public void setSunset_2(String sunset_2) {
        this.sunset_2 = sunset_2;
    }

    public Environment getEnvironment() {
        return environment;
    }

    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    public Alarm getAlarm() {
        return alarm;
    }

    public void setAlarm(Alarm alarm) {
        this.alarm = alarm;
    }

    public Yesterday getYesterday() {
        return yesterday;
    }

    public void setYesterday(Yesterday yesterday) {
        this.yesterday = yesterday;
    }

    public Forecast getForecast() {
        return forecast;
    }

    public void setForecast(Forecast forecast) {
        this.forecast = forecast;
    }

    public Zhishus getZhishus() {
        return zhishus;
    }

    public void setZhishus(Zhishus zhishus) {
        this.zhishus = zhishus;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}
@Root(name = "environment",strict = false)
 class Environment{
    @Element(name = "aqi",required = false)
    int aqi;
    @Element(name = "pm25",required = false)
    int pm25;
    @Element(name = "suggest",required = false)
    String suggest;
    @Element(name = "quality",required = false)
    String quality;
    @Element(name = "MajorPollutants",required = false)
    String MajorPollutants;
    @Element(name = "o3",required = false)
    int o3;
    @Element(name = "co",required = false)
    int co;
    @Element(name = "pm10",required = false)
    int pm10;
    @Element(name = "so2",required = false)
    int so2;
    @Element(name = "no2",required = false)
    int no2;
    @Element(name = "time",required = false)
    String time;

    public int getAqi() {
        return aqi;
    }

    public void setAqi(int aqi) {
        this.aqi = aqi;
    }

    public int getPm25() {
        return pm25;
    }

    public void setPm25(int pm25) {
        this.pm25 = pm25;
    }

    public String getSuggest() {
        return suggest;
    }

    public void setSuggest(String suggest) {
        this.suggest = suggest;
    }

    public String getQuality() {
        return quality;
    }

    public void setQuality(String quality) {
        this.quality = quality;
    }

    public String getMajorPollutants() {
        return MajorPollutants;
    }

    public void setMajorPollutants(String majorPollutants) {
        MajorPollutants = majorPollutants;
    }

    public int getO3() {
        return o3;
    }

    public void setO3(int o3) {
        this.o3 = o3;
    }

    public int getCo() {
        return co;
    }

    public void setCo(int co) {
        this.co = co;
    }

    public int getPm10() {
        return pm10;
    }

    public void setPm10(int pm10) {
        this.pm10 = pm10;
    }

    public int getSo2() {
        return so2;
    }

    public void setSo2(int so2) {
        this.so2 = so2;
    }

    public int getNo2() {
        return no2;
    }

    public void setNo2(int no2) {
        this.no2 = no2;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
@Root(name = "alarm",strict = false)
 class Alarm{
    @Element(name = "cityKey",required = false)
    int cityKey;
    @Element(name = "cityName",required = false)
    String cityName;
    @Element(name = "alarmType",required = false)
    String alarmType;
    @Element(name = "alarmDegree",required = false)
    String alarmDegree;
    @Element(name = "alarmText",required = false)
    String alarmText;
    @Element(name = "alarm_details",required = false)
    String alarm_details;
    @Element(name = "standard",required = false)
    String standard;
    @Element(name = "suggest",required = false)
    String suggest;
    @Element(name = "imgUrl",required = false)
    String imgUrl;
    @Element(name = "time",required = false)
    String time;

    public int getCityKey() {
        return cityKey;
    }

    public void setCityKey(int cityKey) {
        this.cityKey = cityKey;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getAlarmType() {
        return alarmType;
    }

    public void setAlarmType(String alarmType) {
        this.alarmType = alarmType;
    }

    public String getAlarmDegree() {
        return alarmDegree;
    }

    public void setAlarmDegree(String alarmDegree) {
        this.alarmDegree = alarmDegree;
    }

    public String getAlarmText() {
        return alarmText;
    }

    public void setAlarmText(String alarmText) {
        this.alarmText = alarmText;
    }

    public String getAlarm_details() {
        return alarm_details;
    }

    public void setAlarm_details(String alarm_details) {
        this.alarm_details = alarm_details;
    }

    public String getStandard() {
        return standard;
    }

    public void setStandard(String standard) {
        this.standard = standard;
    }

    public String getSuggest() {
        return suggest;
    }

    public void setSuggest(String suggest) {
        this.suggest = suggest;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
@Root(name = "yesterday",strict = false)
 class Yesterday{
    @Element(name = "date_1",required = false)
    String date_1;
    @Element(name = "high_1",required = false)
    String high_1;
    @Element(name = "low_1",required = false)
    String low_1;
    @Element(name = "day_1",required = false)
    Day_1 day_1;
    @Element(name = "night_1",required = false)
    Night_1 night_1;

    public String getDate_1() {
        return date_1;
    }

    public void setDate_1(String date_1) {
        this.date_1 = date_1;
    }

    public String getHigh_1() {
        return high_1;
    }

    public void setHigh_1(String high_1) {
        this.high_1 = high_1;
    }

    public String getLow_1() {
        return low_1;
    }

    public void setLow_1(String low_1) {
        this.low_1 = low_1;
    }

    public Day_1 getDay_1() {
        return day_1;
    }

    public void setDay_1(Day_1 day_1) {
        this.day_1 = day_1;
    }

    public Night_1 getNight_1() {
        return night_1;
    }

    public void setNight_1(Night_1 night_1) {
        this.night_1 = night_1;
    }
}
@Root(name = "day_1",strict = false)
 class Day_1{
    @Element(name = "type_1",required = false)
    String type_1;
    @Element(name = "fx_1",required = false)
    String  fx_1;
    @Element(name = "fl_1",required = false)
    String fl_1;

    public String getType_1() {
        return type_1;
    }

    public void setType_1(String type_1) {
        this.type_1 = type_1;
    }

    public String getFx_1() {
        return fx_1;
    }

    public void setFx_1(String fx_1) {
        this.fx_1 = fx_1;
    }

    public String getFl_1() {
        return fl_1;
    }

    public void setFl_1(String fl_1) {
        this.fl_1 = fl_1;
    }
}
@Root(name = "night_1",strict = false)
 class Night_1{
    @Element(name = "type_1",required = false)
    String type_1;
    @Element(name = "fx_1",required = false)
    String  fx_1;
    @Element(name = "fl_1",required = false)
    String fl_1;

    public String getType_1() {
        return type_1;
    }

    public void setType_1(String type_1) {
        this.type_1 = type_1;
    }

    public String getFx_1() {
        return fx_1;
    }

    public void setFx_1(String fx_1) {
        this.fx_1 = fx_1;
    }

    public String getFl_1() {
        return fl_1;
    }

    public void setFl_1(String fl_1) {
        this.fl_1 = fl_1;
    }
}
@Root(name = "forecast",strict = false)
 class Forecast{
    @ElementList(name = "weather" ,inline = true )
    List<Weather> weatherList;

    public List<Weather> getWeatherList() {
        return weatherList;
    }

    public void setWeatherList(List<Weather> weatherList) {
        this.weatherList = weatherList;
    }
}
@Root(name = "weather",strict = false)
 class Weather{
    @Element(name = "date",required = false)
    String date;
    @Element(name = "high",required = false)
    String high;
    @Element(name = "low",required = false)
    String low;
    @Element(name = "day",required = false)
    Day day;
    @Element(name = "night",required = false)
    Night night;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getHigh() {
        return high;
    }

    public void setHigh(String high) {
        this.high = high;
    }

    public String getLow() {
        return low;
    }

    public void setLow(String low) {
        this.low = low;
    }

    public Day getDay() {
        return day;
    }

    public void setDay(Day day) {
        this.day = day;
    }

    public Night getNight() {
        return night;
    }

    public void setNight(Night night) {
        this.night = night;
    }
}
@Root(name = "day",strict = false)
 class Day{
    @Element(name = "type",required = false)
    String type;
    @Element(name = "fengxiang",required = false)
    String fengxiang;
    @Element(name = "fengli",required = false)
    String fengli;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFengxiang() {
        return fengxiang;
    }

    public void setFengxiang(String fengxiang) {
        this.fengxiang = fengxiang;
    }

    public String getFengli() {
        return fengli;
    }

    public void setFengli(String fengli) {
        this.fengli = fengli;
    }
}
@Root(name = "night",strict = false)
 class Night{
    @Element(name = "type",required = false)
    String type;
    @Element(name = "fengxiang",required = false)
    String fengxiang;
    @Element(name = "fengli",required = false)
    String fengli;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFengxiang() {
        return fengxiang;
    }

    public void setFengxiang(String fengxiang) {
        this.fengxiang = fengxiang;
    }

    public String getFengli() {
        return fengli;
    }

    public void setFengli(String fengli) {
        this.fengli = fengli;
    }
}
@Root(name = "zhishus",strict = false)
 class Zhishus{
    @ElementList(name = "zhishu" ,inline = true )
    List<Zhishu> zhishuList;

    public List<Zhishu> getZhishuList() {
        return zhishuList;
    }

    public void setZhishuList(List<Zhishu> zhishuList) {
        this.zhishuList = zhishuList;
    }
}
@Root(name = "zhishu",strict = false)
 class Zhishu{
    @Element(name = "name",required = false)
    String name;
    @Element(name = "value",required = false)
    String value;
    @Element(name = "detail",required = false)
    String detail;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
}

好了,看了的同志肯定有这样的疑问:
@Root(name = "resp",strict = false)
@Element(name = "city",required = false)
@ElementList(name = "weather" ,inline = true )
这些注解都是什么意思:
我这边简单描述下:使用了retrofit2的simplexml插件,然后都是字面意思。
@Root : 根节点
@Element :元素
@ElementList :元素列表
name="XXXX":是指,在xml中的名字,必须完全相同。
strict = false:xml中有元素,而实体类中没有的时候设置为false.
required = false:实体类中有,xml中没有,且声明为@Element的元素(个人感觉都加上吧,防止xml数据变化)
inline = true:ElementList的一个属性,由于ElementList包了一层,如果为false将不能解析。

听不懂我说的,请移步(simplexml官网:http://simple.sourceforge.net/

步骤三:

写一个WeatherService接口,Retrofit2需要用到

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by 奈蜇 on 2018-07-25.
 * WeatherService 
 */
public interface WeatherService {
    @GET("open/api/weather/xml.shtml")
    Call<RespWeather> getRespWeather(@Query("city") String city);
}

https://www.sojson.com/open/api/weather/xml.shtml?city=北京
为什么要用@Query而不是@Path,因为接口中存在?问号。

请求:

   private void get(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.sojson.com")
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .build();

        WeatherService service = retrofit.create(WeatherService.class);
        service.getRespWeather("北京").enqueue(new Callback<RespWeather>() {
            @Override
            public void onResponse(Call<RespWeather> call, Response<RespWeather> response) {
                if(response.isSuccessful()){
                    RespWeather respWeather = response.body();
                    Log.d(TAG,respWeather.toString());
                }else {
                    Log.d(TAG, "请求失败!");
                }
            }

            @Override
            public void onFailure(Call<RespWeather> call, Throwable t) {
                Log.d(TAG, "请求失败!");
            }
        });
    }

好了,Debug看下结果如何


结果

我们可以看到除了xml中没有的元素是null,其他都解析成功

相关文章

网友评论

      本文标题:Retrofit2解析天气API XML接口

      本文链接:https://www.haomeiwen.com/subject/zippmftx.html