Swift - 使用原生的XMLParser类来解析xml数据(附样例)
作者:hangge | 2018-07-13 08:10
有时我们的应用需要解析 XML 数据,比如获取 Web Service 数据、读取 RSS 新闻或者博客数据源。我之前也写过文章介绍如何借助第三方库来解析 XML 格式数据。
其实苹果原生就提供了 XMLParser 类来解析 XML 文档数据,而不需要再引入其它第三方库(当然用起来与上面这两个第三方库相比,会麻烦些),下面通过样例进行演示。
1,效果图
(1)假设我们有一个需要被解析的 XML 数据文件(users.xml),内容如下:
<?xml version="1.0" encoding="utf-8"?> <Users> <User id="101"> <name>航歌</name> <tel> <mobile>1234567</mobile> <home>025-8100000</home> </tel> </User> <User id="102"> <name>hangge</name> <tel> <mobile>8989889</mobile> <home>025-8122222</home> </tel> </User> </Users>
(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)! //设置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) } } }
全部评论(0)