上一次串接API 說明了解析JSON資料的方式~~~
這一次要來說明如何解析 XML 資料!!!
今天的例子為:
RSS Feeds — 新聞閱讀文章
API網址:https://www.cnet.com/rss/news/
成果如下:
- 先決定要取得什麼資料
- 新聞標題title — 放在 table view 中顯示新聞標題
- 新聞網址link — 點擊新聞標題進入新聞內容(link連結顯示網頁)
- 如何使用URLSession、Data下載資料
如何顯示網頁 以及 loading 符號
可以看這篇文章~~~
解析XML資料 — XMLParserDelegate 程式碼
- 建立一個 新檔案 XMLParserDelegate 程式碼
- 創立 ParserDelegate class
- 要先服從 NSObject 才能服從 XMLParserDelegate
- 我們需要解析的 tag 有 item 裡面的 title 和 link
- 新增三個屬性
- var currentItem: NewsItem? — 目前物件(型態為NewsItem 有title & link)
- var currentElementValue: String? — 目前元素內容值(存放解析後的字串)
- var resultArray = [NewsItem]() — 最後取得的新聞陣列
- func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:])
- 碰到標籤tag <> 就會觸發 開始解析
- 如果 tag 為 item — 開始一個 新的新聞 currentItem = NewsItem()
- 如果 tag 為 title— 將目前元素內容值設為nil(重新開始)
- 如果 tag 為 link— 將目前元素內容值設為nil(重新開始)
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
- func parser(_ parser: XMLParser, foundCharacters string: String)
- 碰到標籤的內文字母時 就會開時讀取
- 將解析的字串累加放進 currentElementValue
- func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
- 再次 碰到相同標籤tag</>就會觸發 結束這段解析
- 如果 tag 為 item — 將目前新聞內容(currentItem)append放進resultArray
並將目前元素內容值(currentElementValue)重新設為nil - 如果 tag 為 title — 將currentElementValue,放進currentItem.title
- 如果 tag 為 link — 將currentElementValue,放進currentItem.link
完整流程執行順序如下~~~
- 最後設置一個取得資料的func
- 回傳 resultArray 取得所有新聞的title 和 link
- 接著回到原本的程式碼中 下載 XML 資料
if let loadData = data{
let parser = XMLParser(data: loadData)
let rssParserDelegate = RssParserDelegate()
parser.delegate = rssParserDelegate
if parser.parse() == true{
self.news = rssParserDelegate.getResult()
DispatchQueue.main.async {
self.myTableView.reloadData()
}
}
}
如果還有不懂的地方
完整程式碼可以看這裡~~~