解析 XML
IOS SDK 本身已經內建 XML 解析器 NSXMLParser 了,除非要解析的 XML 檔案太複雜,否則使用內建的解析器就可以完成許多工作。
首先,在這個範例中,我們先建立一個簡單的 XML 檔案,檔名為 test.xml,並將他加到專案中。檔案內容如下:
<student begin_year="2016" end_year="2020">
<id>A01</id>
<name>Eric</name>
<tel>1234567</tel>
</student>
透過解析器的解析,我們能得到 2016、A01、Eric、1234567 這些內容
步驟說明
- 建立 Single View App 專案 :
新增一個檔案,檔名取為 test.xml。產生後輸入下列內容
<student begin_year="2016" end_year="2020"> <id>A01</id> <name>Eric</name> <tel>1234567</tel> </student>
開啟 ViewController.swift,這個類別需要符合 XMLParserDelegate 協定的規範。並且宣告一個變數,目的是之後用來存放解析到的標籤名稱。
Class ViewController: UIViewController, XMLParserDelegate { var tagName: String? = nil
在 ViewDidLoad() 中開啟 test.xml 檔並且啟動 Parser
override func viewDidLoad() { super.viewDidLoad() let url = Bundle.main.url(forResource: "test", withExtension: "xml") if let xml = XMLParser(contentsOf: url!) { xml.delegate = self xml.parse() } }
實作 parser(_:didStartElement:namespeceURI:qualifedName:attributes:),這個函數可以抓到 XML 標籤中的開始標籤。
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { tagName = nil switch elementName { case "student" : /* 印出 begin_year: 2016 end_year: 2020 */ for key in attributeDict.keys { let value = attributeDict[key] print("\(key): \(value!)") } default: tagName = elementName } }
實作 parser(_:foundCharacters:) 函數,這個函數用來取得開始標籤與結束標籤間的內容
func parser(_ parser: XMLParser, foundCharacters string: String) { guard tagName != nil else { return } /* 印出 id: A01 name: Eric tel: 1234567 */ print("\(tagName!): \(string)") }
實作 parser(_:didEndElement:namespaceURI:qualifiedName:)函數,這個函數用來取得結束標籤。
func parser(_ parser: XMLParser, didEndElement elementName : String, namespaceURI: String?, qualifiedName qName: String?) { tagName = nil }
執行結果
begin_year: 2016
end_year: 2020
id: A01
name: Eric
tel: 1234567