韌館-LearnHouse

[WP7]在Phone7如何實作HTML Parser

由於客戶的關係讓微軟輾轉找上我們,原來微軟最近剛推芒果(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]
2011年12 月 posted by admin in 程式&軟體 and have Comments (2)

2 Responses to “[WP7]在Phone7如何實作HTML Parser”

  1. HERBIE表示:

    可以教我怎麼使用這個套件嗎?
    我遇到了一些問題?
    拜託~

  2. yuchin表示:

    你遇到什麼問題?

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: