swift4--解析XML文件

首先添加两个文件

1.XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<workers>
	<worker id='1'>
		<name>Jerry</name>
		<age>35</age>
		<salary>25600</salary>
	</worker>
	<worker id='2'>
		<name>Stone</name>
		<age>33</age>
		<salary>257800</salary>
	</worker>	
</workers>

2.swift文件

import Foundation
//该实体类中的字段对应XML中的元素
class Worker: NSObject {
    var id : String = ""
    var name : String = ""
    var age : String = ""
    var salary : String = ""
}

然后在视图控制器文件中编写代码,XML解析文件

//解析XML文档
import UIKit
//在新版swift中原来的NSXMLParseDelegate无效
class ViewController: UIViewController , XMLParserDelegate {

//    为当前视图控制器添加三个属性
//    标示解析后的对象数组
    private var workers : NSMutableArray! = NSMutableArray()
//    当前遍历到的标签名称
    private var currentTag : NSString!
//    以及正在生成的实体对象
    private var currentWork : Worker!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
//        从项目目录中读取待解析文档 forResource(文件名)ofType(文件类型)
        var xmlPath : NSString! = NSString()
        xmlPath = Bundle.main.path(forResource: "swiftTestXml", ofType: "xml")! as NSString
        do{
//            读取指定位置上的文件,并转换为字符串常量
            let xmlContent : NSString! = try NSString(contentsOfFile: xmlPath as String, encoding: 1)
            print("\(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("---------------- Begin")
    }

//    添加一个代理方法,标志解析动作的结束
    func parserDidEndDocument(_ parser: XMLParser) {
        print("---------------- End")
        for i in 0 ..< workers.count {
//            完成解析任务后,在控制台打印输出最终结果
            let work = workers[i] as! Worker
            print(work.id)
            print(work.name)
            print(work.age)
            print(work.salary)
        }
    }
    
//    添加一个代理方法,当解析到一个开始标签时调用此方法
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
//        获得当前标签的名称
        currentTag = elementName as NSString
//        如果标签对应于实体类,则初始化一个实体类对象,并设置实体类对象的唯一标识符的值,为当前标签的属性值
        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?) {
//        当前XML文件结束标签的名称是salary,如果监测到salary标示一个实体类的标签检索即将结束
        if elementName == "salary"
        {
            workers.add(currentWork)
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

猜你喜欢

转载自blog.csdn.net/weixin_41735943/article/details/81261008