有时我们的应用需要解析 XML 数据,比如获取 Web Service 数据、读取 RSS 新闻或者博客数据源。我之前也写过文章介绍如何借助第三方库来解析 XML 格式数据。
其实苹果原生就提供了 XMLParser 类来解析 XML 文档数据,而不需要再引入其它第三方库(当然用起来与上面这两个第三方库相比,会麻烦些),下面通过样例进行演示。
1,效果图
(1)假设我们有一个需要被解析的 XML 数据文件(users.xml),内容如下:

(2)需要将其解析出来并输出到控制台中:

2,样例代码
import UIKit
//用户对象
struct User {
var id: String? //编号
var name: String? //姓名
var mobile: String? //手机
var home: String? //固话
}
class ViewController: UIViewController,XMLParserDelegate {
//保存最终解析的结果
var users:[User] = []
//当前元素名
var currentElement = ""
//当前用户
var user:User!
override func viewDidLoad() {
super.viewDidLoad()
//获取xml文件路径
let file = Bundle.main.path(forResource: "users", ofType: "xml")
//初始化parser
let parser = XMLParser(contentsOf: NSURL(fileURLWithPath: file!) as URL)!
// 上面是文件,下面是字符串的例子,把xml格式的字符串解析
//let parser = XMLParser.init(data: dataString.data(using: .utf8)!)
//设置delegate
parser.delegate = self
//开始解析
parser.parse()
//输出结果
for i in 0...(users.count - 1 ){
print("User: id:\(users[i].id!),name:\(users[i].name!),"
+ "mobile:\(users[i].mobile!),home:\(users[i].home!)")
}
}
// 遇到一个开始标签时调用
func parser(_ parser: XMLParser, didStartElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?,
attributes attributeDict: [String : String] = [:]) {
currentElement = elementName
//当elementName是 "User"时,表示开始解析一个新用户了
if elementName == "User"{
//创建一个新用户对象
user = User()
//保存下id
user.id = attributeDict["id"]
}
}
// 遇到字符串时调用
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: .whitespacesAndNewlines)
//接下来每遇到一个字符,将该字符追加到相应的 property 中
switch currentElement{
case "name":
user.name = user.name ?? "" + data
case "mobile":
user.mobile = user.mobile ?? "" + data
case "home":
user.home = user.home ?? "" + data
default:
break
}
}
// 遇到结束标签时调用
func parser(_ parser: XMLParser, didEndElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?) {
//标签User结束时将该用户对象,存入数组容器。
if elementName == "User"{
users.append(user)
}
}
}