返回 导航

Swift

hangge.com

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)

回到顶部