Swift — 串接API & 解析XML 資料

Anny
6 min readNov 1, 2020

上一次串接API 說明了解析JSON資料的方式~~~

這一次要來說明如何解析 XML 資料!!!

今天的例子為:

RSS Feeds — 新聞閱讀文章

API網址:https://www.cnet.com/rss/news/

成果如下:

  1. 先決定要取得什麼資料
  2. 新聞標題title — 放在 table view 中顯示新聞標題
  3. 新聞網址link — 點擊新聞標題進入新聞內容(link連結顯示網頁)
  • 如何使用URLSession、Data下載資料
    如何顯示網頁 以及 loading 符號
    可以看這篇文章~~~

解析XML資料 — XMLParserDelegate 程式碼

  1. 建立一個 新檔案 XMLParserDelegate 程式碼
  2. 創立 ParserDelegate class
  3. 要先服從 NSObject 才能服從 XMLParserDelegate
  • 我們需要解析的 tag 有 item 裡面的 title 和 link
  • 新增三個屬性
  1. var currentItem: NewsItem? — 目前物件(型態為NewsItem 有title & link)
  2. var currentElementValue: String? — 目前元素內容值(存放解析後的字串)
  3. var resultArray = [NewsItem]() — 最後取得的新聞陣列
  • func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:])
  • 碰到標籤tag <> 就會觸發 開始解析
  1. 如果 tag 為 item — 開始一個 新的新聞 currentItem = NewsItem()
  2. 如果 tag 為 title— 將目前元素內容值設為nil(重新開始)
  3. 如果 tag 為 link— 將目前元素內容值設為nil(重新開始)

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

  • func parser(_ parser: XMLParser, foundCharacters string: String)
  • 碰到標籤的內文字母時 就會開時讀取
  • 將解析的字串累加放進 currentElementValue
  • func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
  • 再次 碰到相同標籤tag</>就會觸發 結束這段解析
  1. 如果 tag 為 item — 將目前新聞內容(currentItem)append放進resultArray
    並將目前元素內容值(currentElementValue)重新設為nil
  2. 如果 tag 為 title — 將currentElementValue,放進currentItem.title
  3. 如果 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()
}
}
}

如果還有不懂的地方

完整程式碼可以看這裡~~~

--

--