由於客戶的關係讓微軟輾轉找上我們,原來微軟最近剛推芒果(Mango)機,所以希望有大量使用者的APP廠商能也提供Phone7的版本
又剛好我進公司就是想致力於智慧手機的開發,因此主管就派我去測試這個新技術
我花半個月的時間邊測試邊將開出的功能規格實作出來,再來的半個月就看能不能將GUI的設計美化
老實說我念書的時候只會寫Native Code(C/C++),反而我這年紀的年輕人應該會比較熟的Managed code(Java, C#)我真的沒有什麼經驗
這個半月下來我在Phoe7研究出了很多心得,也是第一次寫C#的程式
有空的話我再一一的把一些Phone7的開發心得與教學發表上來,讓入門的人不用再重新走我走過的冤枉路在C#想要做到HTML Parsing拜見估狗會發現大家都會指向使用第三方的套件HTML Agility Pack
很無奈的指提供PC上的版本,不過後來在該官方的討論區得知原來也有提供Phone7的版本
下載的SourceCode中Trunk資料夾內就有Phone7的專案(HAPPhone.sln),自己編譯成dll或直接匯入程式就可以使用
在用法上也讓我吃盡苦頭,因為他的寫法很奇怪,用法更是奇怪,不知道是不是因為我真沒什麼寫managed cdoe經驗的關係
而且只能吃要parsing的HTML網址(Uri),雖然後來我有去改SourceCode讓它也能吃HTML的文字檔,但沒有改得很漂亮
有需要的話我在迴響中再分享我修改的不成熟半成品改法吧!!
首先先講使用方式,基本的匯入dll跟dll的呼叫用法我就不詳述了,這個應該估狗一下就會有答案
根據官方的專案看來只能用下面的寫法來呼叫
HtmlWeb.LoadAsync("http://www.google.com", (s, args) => { Results.Text = String.Join(Environment.NewLine, args.Document.DocumentNode.Descendants("a"). Select( x => x.GetAttributeValue("href", "")).ToArray()); });
Parsing的用法是先在args.Document.DocumentNode.Descendants("a")指定要擷取的Tag Element 再來就是取出Tag的屬性值x.GetAttributeValue("href", "")).ToArray());
上面官方的範例就是會取出標籤為
<a href="http://www.google.com">
中的http://www.google.com
而如果要在
<li><a href="http://learn-house.idv.tw/?p=961" title="[WP7]在Phone7如何實作HTML Parser">
取出[WP7]在Phone7如何實作HTML Parser就只要分別修改args.Document.DocumentNode.Descendants("a")與x.GetAttributeValue("title", "")).ToArray());
要特別注意的是,就算HTML的Tag是大寫字母,也一定要小寫來取出,不然會取不到值
再來就是取出的值要怎麼丟出來使用,因為取到的值充其量只是個區域變數,根本丟不出來使用
所以這個範例Code用Results.Text來接這個結果值,Results.Text是顯示文字的控制項(TextBlock)
但這用法不知道為什麼,如果有在後續進行處理的程式碼,呼叫Parsing的那段程式碼就會失效,程式都不會跑進去
那這樣丟出來只能顯示,不能做任何動作,那又有什麼意義 = ="
在苦思不解的情況下,我是用了一種丟出值的方法,意外發現可以這樣使用
HtmlWeb.LoadAsync("http://www.google.com", (s, args) => { Results.Text = String.Join(Environment.NewLine, args.Document.DocumentNode.Descendants("a"). Select( x => x.GetAttributeValue("href", "")).ToArray()); }); Action act = new Action(OutputResult); this.Dispatcher.BeginInvoke(act, outputString);
第10,11行程式碼就是把值丟出來,我們再寫一個function(上面指定OutputResult為接收的callback function)來接收這個值,outputString即為丟出的值,進一步再來對值做處理
void OutputResult(string outputString) { StringReader reader = new StringReader(outputString); string line; int i = 0; while ((line = reader.ReadLine()) != null) { parsingResult[i] = line; i++; } }
parsingResult是字串陣列,我用它來儲存接收結果值
透過parsingResult,這樣就能開心的使用Parsing後的結果啦~~~
[/html]
可以教我怎麼使用這個套件嗎?
我遇到了一些問題?
拜託~
你遇到什麼問題?