[Xcode 實際操做]7、文件與數據-(16)解析XML文檔

目錄:[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 }
相關文章
相關標籤/搜索