目錄:[Swift]Xcode實際操做html
本文將演示如何解析XML文檔。swift
項目中已添加一份XML文檔:worker.xml數組
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <workers> 3 <worker id='1'> 4 <name>Jerry</name> 5 <age>35</age> 6 <salary>25600</salary> 7 </worker> 8 <worker id='2'> 9 <name>Stone</name> 10 <age>33</age> 11 <salary>27800</salary> 12 </worker> 13 </workers>
此外還添加了一個實體類,實體類的字段,對應於XML中的元素。ide
1 import Foundation 2 3 class Worker: NSObject 4 { 5 var id : String = "" 6 var name : String = "" 7 var age : String = "" 8 var salary : String = "" 9 }
在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】post
1 import UIKit 2 3 //首先引入文檔的解析代理協議XMLParserDelegate, 4 //主要的解析工做,都是靠代理來實現的。 5 class ViewController: UIViewController, XMLParserDelegate { 6 7 //爲當前的視圖控制器類,添加三個屬性。 8 //第一個屬性:解析後的對象數組 9 fileprivate var workers : NSMutableArray! = NSMutableArray() 10 //第二個屬性:當前遍歷到的標籤名稱 11 fileprivate var currentTag : String! 12 //第三個屬性:正在生成的實體對象 13 fileprivate var currentWork : Worker! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 // Do any additional setup after loading the view, typically from a nib. 18 19 //從項目的目錄結構中,讀取等待解析的文檔 20 var xmlPath : String = Bundle.main.path(forResource: "worker", ofType: "xml")! 21 22 //添加一條異常捕捉語句,用於讀取指定位置上的文件 23 do 24 { 25 //讀取指定位置上的文件, 26 //將讀取後的內容,轉換爲字符串常量, 27 let xmlContent : NSString! = try NSString(contentsOfFile: xmlPath as String, encoding: 1) 28 //在控制檯打印輸出讀取的內容 29 print("\(String(describing: xmlContent))") 30 31 //建立一個解析對象,並設置字符的編碼模式 32 let myParse = XMLParser(data: xmlContent.data(using: String.Encoding.utf8.rawValue)!) 33 //設置解析對象的代理,爲當前視圖控制器對象 34 myParse.delegate = self 35 36 //開始解析文檔 37 if(!myParse.parse()) 38 { 39 //當解析錯誤時 40 //在控制檯輸出錯誤日誌 41 print("\(String(describing: myParse.parserError))") 42 } 43 } 44 catch 45 { 46 print("Error.") 47 } 48 } 49 50 //添加一個代理方法,用來標識解析動做的開始 51 func parserDidStartDocument(_ parser: XMLParser) { 52 print("------------ Begin") 53 } 54 55 //添加一個代理方法,用來標識解析動做的結束 56 //當完成解析任務後,在控制檯打印輸出最終結果 57 func parserDidEndDocument(_ parser: XMLParser) { 58 print("------------ End") 59 //添加一個循環語句 60 for i in 0 ..< workers.count 61 { 62 //得到數組中的指定索引的對象 63 let work = workers[i] as! Worker 64 //在控制檯依次打印輸出,解析後的各項內容。 65 print(work.id) 66 print(work.name) 67 print(work.age) 68 print(work.salary) 69 } 70 } 71 72 //添加一個代理方法,當解析到一個開始標籤時,調用此方法 73 func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 74 //得到當前標籤的名稱 75 currentTag = elementName 76 //判斷當前的標籤,是否對應於指定的實體類。 77 if currentTag == "worker" 78 { 79 //若是當前標籤對應於實體類, 80 //則初始化一個實體類對象。 81 currentWork = Worker() 82 //並設置實體類對象惟一標識符的值,爲當前標籤的屬性值。 83 currentWork.id = attributeDict["id"]! 84 } 85 } 86 87 //添加一個代理方法,當解析到一個標籤的所有或部分時,調用此方法 88 func parser(_ parser: XMLParser, foundCharacters string: String) { 89 //得到檢索到的字符串,並去除字符串中的空格和換行符 90 let str:String! = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 91 //根據當前標籤的名稱,設置實體類名稱屬性的值 92 if currentTag == "name" && str != "" 93 { 94 currentWork.name = string 95 } 96 //設置實體類年齡屬性的值 97 else if currentTag == "age" && str != "" 98 { 99 currentWork.age = string 100 } 101 //設置實體類薪水屬性的值 102 else if currentTag == "salary" && str != "" 103 { 104 currentWork.salary = string 105 } 106 } 107 108 //添加一個代理方法,當解析到一個結束標籤時,調用此方法 109 func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 110 //根據XML文檔的結構,若是結束標籤的名稱時Salary, 111 //表示對一個實體類的標籤檢索即將結束, 112 //則將實體對象添加到數組中 113 if elementName == "salary" 114 { 115 workers.add(currentWork) 116 } 117 } 118 119 override func didReceiveMemoryWarning() { 120 super.didReceiveMemoryWarning() 121 // Dispose of any resources that can be recreated. 122 } 123 }