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