栗子:
话不多说直接讲例子吧,天气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,其他都解析成功
网友评论