#Swift 解析 Xml及webkit(二)

Drake
彼得潘的 Swift iOS / Flutter App 開發教室
6 min readSep 22, 2018

使用假資料呈現做完了,表示我們的collectionView可以正確顯示資料,所以可以開始來寫如何解析xml格式的資料

  1. 下載資料

下載資料的方式可以用data去load資料,先是需要address>url>URLSession>task大概知道方向後可以開始執行程式碼的撰寫

session我宣告成全域變數,所以method裡直接取用就好

var session = URLSession(configuration: .default)

值得注意的是用URLSession去取得的資料會是預設在共時貯列裡,所以不用再把它寫進diapatchQueue.global().async{}裡面

URL(String:)取得的資料會是一個optional,所以這邊做一個optional binding取直,並可以用dataTask的方法去下載取得資料,最後再處理resume()

這個方法handler裡面要放的是一個closure,分別處理三個參數回傳一個空的,裡面先去判斷error的狀況,有可能是沒有網路的狀況,沒有網路的話這裡的error回得到一個非nil的狀態

一但遇到這個狀態我就讓他return跳出,下面的程式都不執行了

接下來再處理data的部分,一樣做個optional binding確保得到的直不是nil,然後裡面再去做xml的資料解析,將資料load完後因為顯示在螢幕上跟畫面有關係,所以用主貯列去顯示資料,裡面用collectionview取reloadData就好

不過在此之前先來做如何解析xml

2. 解析xml的delegate

xml是什麼,其實看到他還真的不陌生,這種標籤語言,以前大學寫過php做過網站,一定會使用到html,差別只在於一個主要用於網站一個則是資料傳輸,都是用標籤把資料結構化的語言。

這次練習的目標是用apple的itunes提供的rss服務

我選擇的是 top 25 album的資料
點進去會看到xml的資料呈現這樣

要解析xml的資料需要用到的方法

因為需要將需要的資料取下來並結構化,先在專案裡開啟一個新的檔案,選擇.swift的檔案。

我們新建一個檔案用來專門解析load下來的xml資料,裡面自己定義class,因為是自行定義一個protocol,而這個class一定要去繼承NSObject,因為 iOS SDK 內建類別都繼承自 NSObject。

裡面我們可以去實作下面幾種方法

<title>iTunes Store: Top Songs</title>

以上面這段資料為例,<title>是開始標籤,</title>為結束標籤,裡面的Character就是字元內容。

當程式讀取到開始標籤會執行didstartElement,讀到結束標籤會執行didEndElement,再來foundCharacters則是讀取到裡面的字元時會執行的。

根據我自己要從xml擷取的資料,我需要<entry><title><id><im:image>這些標籤裡的資料,在上面提到的三個方法裡去做if判斷分別將資料存到陣列裡

以此類推

在三個方法裡寫好判斷後,最後再寫一個方法把所有存完所有結果的資料存進陣列裡回傳出來

如此一來回到原本的檔案,就可以在下載的function裏利用delegate的方式parser 這些資料

這樣做完就可以成功把資料load下來了,記得回去再cellForItemAt的方法裡將取得的資料告訴它每一個需要呈現什麼資料。

這邊也是莫名的卡很久,當初也不知道腦袋在打什麼結,回傳過來的照片連結因為是字串,所以後來乾脆在寫個方法把object[indexPath.row].imageLink得到的資料下載成照片顯示出來

以上大概只是寫一些主要的方式及資料下載的方式,實際上還是有許多細節跟思考的地方,比如說要如何解析xml資料當初也是卡很久,如何將資料結構化存取下來,也是看了許多資料,才成功的,大致功能約莫是如此。

上班族一邊進修一邊工作好累…不過這樣的生活好像過的意外地充實呢

期待有能力離開目前公司的那天,每次打完文章都會有種激昂熱血的感覺呢XD

--

--

Drake
彼得潘的 Swift iOS / Flutter App 開發教室

2018/06/04 記錄自己前往成為開發者的道路,以及自己的學習筆記。