IOS資料處理及版本特性-解析XML檔案
阿新 • • 發佈:2018-11-22
準備一個需要解析的xml檔案
<?xml version="1.0" encoding="UTF-8" ?> <workers> <worker id='1'> <name>Jerry</name> <age>35</age> <salary>256oo</salary> </worker> <worker id='2'> <name>Stone</name> <age>33</age> <salary>278oo</salary> </worker> </workers>
建立一個和xml檔案標籤對應的實體類
import Foundation
class Worker: NSObject {
var id : String = ""
var name:String = ""
var age :String = ""
var salary:String = ""
}
對xml進行解析
/ // ViewController.swift // Dome2test // // Created by 郭文亮 on 2018/11/21. // Copyright © 2018年 finalliang. All rights reserved. // import UIKit //引入文件的解析代理協議XMLParserDelegate class ViewController: UIViewController , XMLParserDelegate { //為當前檢視控制器新增屬性 //分別為:解析後的陣列物件。當前遍歷的標籤名。正在生成的例項 fileprivate var workers : NSMutableArray! = NSMutableArray() fileprivate var currentTag : String! fileprivate var currentWork : Worker! override func viewDidLoad() { super.viewDidLoad() //從目錄結構中 讀取等待解析的檔案 var xmlPath : String xmlPath = Bundle.main.path(forResource: "worker", ofType: "xml")! do { //讀取指定位置上的檔案 將內容轉換成字串常量 let xmlContent:NSString! = try NSString(contentsOfFile: xmlPath, encoding: 1) print("\(String(describing: xmlContent))") //建立一個解析物件 ,設定編碼模式 設定解析物件代理為當前檢視控制器物件 let myParse = XMLParser(data: xmlContent.data(using: String.Encoding.utf8.rawValue)!) myParse.delegate = self //開始解析文件 if !myParse.parse() { print("\(String(describing: myParse.parserError))") } }catch{ print("Error.") } } //新增一個代理方法。 用來標識解析動作的開始 func parserDidStartDocument(_ parser: XMLParser) { print("\n-----------Begin----------\n") } //新增代理方法 。 用來標識解析動作的結束 func parserDidEndDocument(_ parser: XMLParser) { print("\n----------- END -----------\n") for i in 0..<workers.count { let wek = workers[i] as! Worker print(wek.id) print(wek.name) print(wek.age) print(wek.salary) } } //新增一個代理方法。 當解析到一個開始標籤時。呼叫此方法 func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { //獲得當前標籤的名稱 currentTag = elementName if currentTag == "worker" { currentWork = Worker() currentWork.id=attributeDict["id"]! } } //新增一個代理方法 當解析道一個標籤的全部或部分字元時 呼叫此方法 func parser(_ parser: XMLParser, foundCharacters string: String) { //獲得檢索到的字串,並去除字串中的空格和換行符 let str:String! = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) //根據當前標籤的名稱,設定實體類名稱屬性的值 if (currentTag == "name") && (str != "") { currentWork.name = string }else if (currentTag == "age") && (str != "") { currentWork.age = string }else if (currentTag == "salary") && (str != "") { currentWork.salary = string } } //代理方法 當解析到一個結束標籤時,呼叫此方法 func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { //如果結束標籤時最後一個標籤 表示一個實體類的檢索即將結束 則將其儲存到例項類陣列中 if elementName == "salary" { workers.add(currentWork) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }