windows phone 7 中文天气预报应用--来源http://www.cnblogs.com/liulunet/archive/2011/08/17/2141696.html...
wp7的應(yīng)用還是太少了,中文應(yīng)用更少。雖然有天氣預(yù)報(bào)應(yīng)用但是自己感覺(jué)并不好用,感覺(jué)這樣的程序應(yīng)該很簡(jiǎn)單,于是萌生了自己寫一個(gè)的想法。
印證了群里朋友說(shuō)的一句話:程序員往往都是使用別人的程序覺(jué)得這里不好那里不好,等到自己想做一個(gè)的時(shí)候才發(fā)現(xiàn)水很深。
?
整個(gè)過(guò)程真是幾經(jīng)波折。先在網(wǎng)上搜索一番,發(fā)現(xiàn)了Windows Phone 7 網(wǎng)絡(luò)編程之天氣預(yù)報(bào)應(yīng)用, 看到xml解析的時(shí)候就知難而退了,因?yàn)樵趯W(xué)校的時(shí)候?qū)W習(xí)xml無(wú)果。于是這個(gè)想法在我的onenote里面待了很久,最近終于在工作上需要解析xml硬 著頭皮了解了一下,其實(shí)并不是那么難。于是開始動(dòng)手做吧,先后又遇到了網(wǎng)絡(luò)文件無(wú)法直接調(diào)用,xml文件讀取出來(lái)是亂碼等等問(wèn)題,找了很多資料和文檔,現(xiàn) 在終于實(shí)現(xiàn)了。
?
?
接下來(lái)說(shuō)下程序的編寫過(guò)程:
?
我使用了LINQ to XML來(lái)解析xml文件,在加載xml的時(shí)候最開始文件路徑我直接填寫了http://www.google.com/ig/api?weather=guangzhou,報(bào)錯(cuò)信息大致是不能直接填寫web網(wǎng)絡(luò)路徑。找了一下資料,HttpWebRequest相關(guān)的東西沒(méi)看明白,使用WebClient來(lái)獲取網(wǎng)絡(luò)文件資源。這里參考了將網(wǎng)絡(luò)資源寫入WP7隔離存儲(chǔ)空間
?| 1 2 3 4 5 6 7 8 9 | string url = "http://www.google.com/ig/api?weather=guangzhou&hl=zh-cn";//&hl=zh-cn WebClient wc = new WebClient(); Uri uri = new Uri(url); wc.OpenReadAsync(uri, "api.xml");//第一種方法讀取網(wǎng)絡(luò)資源,打開流向指定資源的可讀流 wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);//讀取完成以后觸發(fā)的事件 wc.DownloadStringAsync(uri, "api.xml");//第二種方法讀取網(wǎng)絡(luò)資源,將指定的字符串下載到指定的資源 wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);//讀取完成后觸發(fā)的事件 |
讀取完成后觸發(fā)事件的機(jī)制我并不了解,在這里繞了很久的彎。我將對(duì)天氣對(duì)象的賦值操作寫在讀取完成的事件里面,而對(duì)程序頁(yè)面上的TextBlock 賦值顯示的語(yǔ)句寫在獲取網(wǎng)絡(luò)資源語(yǔ)句之后,實(shí)際的執(zhí)行順序是執(zhí)行了獲取資源語(yǔ)句以后并沒(méi)有直接跳轉(zhuǎn)到讀取完成事件里面的語(yǔ)句(因此天氣對(duì)象的值仍然是空 的),直接執(zhí)行了后面的TextBlock賦值語(yǔ)句,最后才跳轉(zhuǎn)到讀取完成的事件里面對(duì)天氣對(duì)象賦值。結(jié)果程序運(yùn)行顯示的天氣為空。這個(gè)事件還得詳細(xì)了 解。
?
解決這個(gè)問(wèn)題以后程序能夠順利運(yùn)行并從網(wǎng)絡(luò)更新數(shù)據(jù)了
?
但是接著問(wèn)題就來(lái)了:在電腦上訪問(wèn)http://www.google.com/ig/api?weather=guangzhou返回的xml文件是中文的,Windows Phone 7 網(wǎng)絡(luò)編程之天氣預(yù)報(bào)應(yīng)用的作者也提到,在WP7中訪問(wèn)這個(gè)接口返回的xml文件是英文的,圖中可以看到最高溫度和最低溫度都是華氏溫度單位。評(píng)論中有人提到增加&hl=zh-cn以后返回的就是中文,我修改了程序中的相應(yīng)地址以后,程序變成了這樣:
中文部分全都變成了亂碼!!!在網(wǎng)上搜索了一下找到了問(wèn)題所在
?
返回的XML的頭部,<?xml version="1.0" ?>,跟標(biāo)準(zhǔn)的XML頭部相比缺少了類似encoding=UTF-8這樣的編碼聲明。于是懷疑正是由于這一點(diǎn)導(dǎo)致SAX或者DOM解析器把本不是 UTF-8的字符編碼當(dāng)作UTF-8來(lái)處理,于是導(dǎo)致了亂碼和異常。經(jīng)過(guò)google搜索證實(shí)當(dāng)使用hl=zh-cn時(shí)返回的是GBK編碼的XML,并且 有許多用到這個(gè)API的php代碼都做了GBK->UTF-8的轉(zhuǎn)換處理。
問(wèn)題到了這里其實(shí)就很簡(jiǎn)單了,既然是GBK編碼SAX和DOM默認(rèn)當(dāng)UTF-8來(lái)處理,并且我們不可能去更改GOOGLE的Servlet讓他返回 一個(gè)在XML頭部帶encoding=GBK的XML。那么我們只有兩個(gè)辦法,要嘛就把返回的XML從GBK編碼轉(zhuǎn)碼到UTF-8,要嘛就讓SAX和 DOM解析器把XML當(dāng)GBK來(lái)處理。
?
雖然是不同的平臺(tái),但也有相通的地方啊~~雖然找到了問(wèn)題所在,但是解決方法可不那么簡(jiǎn)單了,搜索了很久都說(shuō)wp7不支持GBK編碼,找了幾個(gè)轉(zhuǎn)碼的方法也運(yùn)行不了,MSDN上說(shuō)只支持utf8和utf16。就要放棄了,已經(jīng)在考慮天氣預(yù)報(bào)也就那幾個(gè)數(shù)據(jù),自己寫個(gè)判斷晴天多云的用中文顯示算了。這時(shí)候群里的朋友給了一個(gè)類,能夠讓Silverlight支持GB2312中文編碼!用上以后在調(diào)試的過(guò)程中終于能在VS里面看到string對(duì)象的內(nèi)容變成中文了。
?
最后將包含中文xml信息的string對(duì)象傳到xml解析方法的時(shí)候報(bào)出了'.', hexadecimal value 0x00, is an invalid character.錯(cuò)誤,看來(lái)GBK支持類并不完美。于是繼續(xù)尋找解決方法,原因是由于string包含有無(wú)效字符,已經(jīng)是焦頭爛額了。
找了幾個(gè)方法都會(huì)將中文和無(wú)效字符一起去掉,并最后找到了一個(gè)C#去除xml無(wú)效字符的方法:
?| 1 2 3 4 5 | public string CleanInvalidXmlChars(string text) { ????string re = @"[^\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF\u4e00-\u9fa5]"; ????return System.Text.RegularExpressions.Regex.Replace(text, re, ""); } |
最終成功傳入中文xml數(shù)據(jù),程序運(yùn)行正常!
?
?
另外在調(diào)試程序的過(guò)程中偶爾不定時(shí)的會(huì)出現(xiàn)xml解析錯(cuò)誤的情況,xml解析方法已經(jīng)寫好了本該不會(huì)出錯(cuò),經(jīng)過(guò)排查發(fā)現(xiàn)是google的問(wèn)題,下面 的xml是我在同一時(shí)間獲取的兩個(gè)不同城市的數(shù)據(jù),廣州的xml文件一切正常,貴陽(yáng)xml文件中框注的內(nèi)容里conditong的data屬性缺失了,相 應(yīng)的icon的data屬性也沒(méi)了,因此解析出錯(cuò)。這個(gè)問(wèn)題不定時(shí)的出現(xiàn),現(xiàn)在僅僅是實(shí)現(xiàn)了中文讀取,今后需要在程序中加入相應(yīng)的錯(cuò)誤檢測(cè)代碼,否則解析 出錯(cuò)程序就會(huì)自動(dòng)退出了。
?
這次編寫程序?qū)ξ业挠绊懞苌羁?#xff0c;看似很簡(jiǎn)單的一個(gè)應(yīng)用卻引出了那么多的問(wèn)題,水很深啊水很深。。。不過(guò)最后成功了,非常開心,也增強(qiáng)了我的自信,遇到困難需要自己動(dòng)手去查去學(xué)不管能不能解決問(wèn)題最終都是肯定能有所收獲的。
轉(zhuǎn)載于:https://www.cnblogs.com/songtzu/archive/2012/04/11/2442601.html
總結(jié)
以上是生活随笔為你收集整理的windows phone 7 中文天气预报应用--来源http://www.cnblogs.com/liulunet/archive/2011/08/17/2141696.html...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Face3D学习笔记(5)3DMM示例源
- 下一篇: vs.net打包生成可执行文件的方法