1. 程式人生 > >IOS資料處理及版本特性-解析XML檔案

IOS資料處理及版本特性-解析XML檔案

準備一個需要解析的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()
    }
}