首先添加两个文件
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.
}
}