IOS数据处理及版本特性-解析XML文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21153627/article/details/84306758

准备一个需要解析的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()
    }
}

猜你喜欢

转载自blog.csdn.net/qq_21153627/article/details/84306758