《基于Dragonbaord 410c开发板的Python交互设计(3)——天气预报xml数据解析.docx》由会员分享,可在线阅读,更多相关《基于Dragonbaord 410c开发板的Python交互设计(3)——天气预报xml数据解析.docx(14页珍藏版)》请在第一文库网上搜索。
1、基于Dragonbaord410c开发板的Python交互设计(3)天气预报xm1数据解析前面己经给大家介绍了在设计天气预报demo中如何设计界面和从网络天气API接口中获取天气数据,但是实际应用中我们可能只需要非常少的一部分天气数据,并且能够见这部分数据提取出来进行单独的显示或者应用,如在你的以Y中你可能只需要在界面中显示一些指数提示,或者只需要简单的天气状态等,这时候我们就需要对获取的数据进行解析了,今天这篇b1og中将进一步教大家如何对获取到的XM1格式的天气数据进行解析。下图是天气XM1数据格式,其实XM1的语法非常简单,主要由标签和内容组成,标签是由起始标签和结尾标签组成,并且可以进
2、行嵌套,这样在解析的过程中,我们通常可以通过判断是否是起始标签,然后读入数据即可,采用循环或者递归的方法都可以完成对XmI的解析。目前对于XM1的解析,已经有很多组件接口可以直接调用,而不需要我们再去从最底层的字符匹配,标签匹配等去编程了,我们只需要掌握这些接口的调用即可,在pyqt中也提供了QtXm1类来用于解析XM1文件,这里提供了多种xm1文件解析方法,我们将用其提供的QXm1StreamReader方法来实现对XM1的处理,这是一种基于流的解析方法,通常比较适合不需要反复的读取数据的场合,在该方法中提供的AP1接口主要有以下几个常用的,当然还有许多其他的AP1接口,大家可以参考QT官方
3、文档。readNext():从Xm1输入流中读取下一个记号name():记号的名称,即名称isStartE1ementO:判断当前已读取的记号是否为开始元素,开始元素即isEndE1ementO:判断当前已读取的记号是否为结束元素,结束元素即/readE1ementText():读取当前记号对应的文本值,文本值/atEndO:判断是否为文件结尾了解了这些我们就可以调用这些接口来获取标签名和判断是否是起始标签,并且可以放的读取标签文本信息。上一篇b1og中,我们用Weather1nfO=bytes,decode(pbyte)语句获取了天气信息并进行了打印,这里其实我们Weather1nfO实一个
4、字符数组,我们可以直接调用WeatherXmI=QtCore.QXm1StreamReader(weatherInfo)函数就可以读入到XM1流中,这样就可以通过WeatherXM1对象来实现对XM1流的相关操作,这里我们写了一个解析从新浪获取的天气数据的Python类来实现对天气数据的解析,其中代码如下:fromPyQt5importQtWidgets,QtCore,QtXm1,QtGui,QtNetworkfrommainwindowimportUi_MainWindow#fromQtGuiimportQPixmapimportresimporttimec1assgetWeather1nf
5、o(object):def_init_(se1f,weatherXm1):se1f.weather_updateOK=Ose1f,weathercity=,z,se1f.weather_wendu=”se1f.WeahteJUPdatetinIe二se1f.Weathejsuggest=”se1f,weatherfeng1i=z,z,se1f.WeatheJfengXiang二se1f.Weathejsunrise=”se1f.WeatheJSUnSet=”se1f,forecastweather_info_date=se1f,forecast_weather_info_high=se1f.f
6、orecast_weather_info_1ow=se1f,forecastweatherinfodtype=se1f.forecast_weather_info_dfengxiang-se1f.forecast_weather_info_dfeng1i=se1f.forecast_weather_info_ntrpe=口se1f.forecast_weather_info_nfengxiang=se1f,forecastweather_infonfeng1i=#指数se1f.weather_zhishu_name=se1f.Weatherzhishuya1e=se1f.weather_zhi
7、shu_data=se1f.PrassWeatherInfo(weatherXm1)defPrassWeatherInfo(se1f,weatherXm1):print(z,startPraSSweather1nfo)whi1enotWeatherXm1atEnd():ifweatherXm1.hasError():print(zzerror:getweatherdataerrorz,)return-1e1ifweatherXm1.IsStartE1ement():ifweatherXm1.name()=zzcityz,:se1f,weathercity=weatherXm1.readE1em
8、entText()#Print(city)weatherXm1.readNext()e1ifweatherXm1.name()z,updatetimez,:se1f.weahter_updatetime=weatherXm1readE1ementText()e1ifWeatherXm1.name(),wenduz,:se1f.weather_wendu=weatherXm1.readE1ementTextOweatherXm1.readNext()e1ifweatherXm1.name()=feng1i”:se1f.weather_feng1i=weatherXm1.readE1ementTe
9、xtOweatherXm1.readNext()e1ifweatherXm1.name()=shidu”:se1f.weather_shidu=weatherXm1.readE1ementTextOweatherXm1.readNext()e1ifweatherXm1.name()-z,fengxiangz,:se1f.weather_fengxiang=weatherXm1.readEIementText()weatherXm1.readNext()e1ifweatherXm1.name()=sunrise_1:se1f,weathersunrise=weatherXm1.readE1ee1
10、ifWeatherXm1.name()=sunset_1:se1f.Weathersunset=WeatherXm1.readE1ementText()WeatherXm1readNext()e1ifWeatherXm1.name()=z*environment?/:print(z,environment,z)whi1enotweatherXm1.atEnd():ifweatherXm1.nameO-,zsuggest*:se1f.weather_suggest=weatherXm1.FeadE1ementText()print(suggest)breake1se:weatherXm1.rea
11、dNext()e1ifweatherXm1.name()=z*forecastzz:rint(weatherXm1.readE1ementText()print(forecast)weatherXm1.readNext()whi1enotweatherXm1.atEnd():ifweatherXm1.iSStartE1ementO:ifWeatherXm1.atEnd():whi1enotweatherXm1.iSStartE1ementO:ifWeatherXm1name()=,datez,:ifint(,weatherinfozz)#pre二weatherXm1.TeadE1ementTe
12、xt()datf.forecastweatherinfodate,append(date)seitherXm1.readNextOweaint(date)#PrweatherXm1.name()=high”:e1ifh=WeatherXm1.KeadE1ementText()higf.forecastweatherinfohigh,append(high)seitherXm1.readNextOweaint(high)#Pre1ifWeatherXm1.name()=1ow:1ow=WeatherXm1.FeadE1ementText()seif.forecast_weather_info_1
13、ow.append(1ow)weatherXm1.readNext()#Print(1ow)e1ifWeatherXm1name()=day:#Print(z,dayinfo)weatherXm1.readNext()whiIenotweatherXm1.atEnd():ifWeatherXm1iSStartE1ementO:ifweatherXm1.name()=type:type=weatherXm1.KeadE1ementTextOse1f.forecast_weather_info_dtype.append(type)weatherXm1.readNext()#Print(type:)
14、rint(type)e1ifWeatherXm1name()=zzfengxiangzz:ffengxiang=weatherXm1.KeadE1ementText()se1f,forecastweather_info_dfengxiang.append(ffengxiang)WeatherXm1.readNext()Sprint(ffengxiang)e1ifWeatherXm1name()=zfeng1iz:ffeng1i=WeatherXm1.FeadE1ementText()se1f,forecastweatherinfodfeng1i.append(ffeng1i)weatherXm
15、1.readNext()#Print(ffeng1i)e1se:weatherXm1.readNext()ftbreake1se:WeatherXm1.readNext()breake1ifweatherXm1.name()=night:#Print(,nightinfo:,z)weatherXm1.readNext()whiIenotweatherXm1.atEnd():ifweatherXm1.IsStartE1ement():ifweatherXm1.nameO,ztype,z:ntype=weatherXm1.FeadE1ementText()se1f.forecast_weather_info_ntype.append(ntype)weatherXm1.readNext()