XML 解析教程

作者:Arthur Knopper,原文链接,原文日期:2016-07-26
译者:pucca;校对:Cwift;定稿:CMB

本教程使用 NSXMLParser 对象对 xml 文件进行解析。解析结果由 Table View 展示。本教程在 Xcode 7.3.1 上基于 iOS 9.3 构建。
打开 Xcode 并且新建一个单视窗应用。名字就叫 IOS9XMLParserTutorial,组织名字和组织标识自己定。语言选 Swift,设备只选 iPhone。

把 View Controller 从 Storyboard 中移除,并拖一个 Navigation Controller 到空的画板里。这个 Navigation Controller 会自动携带一个 Table View Controller。当你把初始的 View Controller 删除时相应的故事板起点也被移除了。所以我们先选中新添加的 Navigation Controller 在 Attribute Inspector 的 "Is Initial View Controller" 复选框打上勾作为新的故事板起点。

双击 able View Controller 的 Title Bar 将其设置为 “Books”。选择 Table View Cell 然后在 Attributes Inspector 中将它的 Style 属性设为 Subtitle。

Storyboard 长这样

既然我们删除了初始 View Controller ,ViewController.swift 也可以一起删除了。选择 iOS->Source->Cocoa Touch Class 添加一个新的文件,命名为 TableViewController,并且设置它为 UITableViewController 的子类。

前往 Storyboard 中选中 Table View Controller,在 Identity inspector 中将 Custom Class 部分设置为 TableViewController。

选择 iOS->Source->Swift File,添加一个新的文件。命名为 Books.xml

打开 Books.xml 替换成以下代码

<?xml version="1.0"?>
<catalog>
    <book id="1">
        <title>To Kill a Mockingbird</title>
        <author>Harper Lee</author>
    </book>
    <book id="2">
        <title>1984</title>
        <author>George Orwell</author>
    </book>
    <book id="3">
        <title>The Lord of the Rings</title>
        <author>J.R.R Tolkien</author>
    </book>
    <book id="4">
        <title>The Catcher in the Rye</title>
        <author>J.D. Salinger</author>
    </book>
    <book id="5">
        <title>The Great Gatsby</title>
        <author>F. Scott Fitzgerald</author>
    </book>
</catalog>

选择 iOS->Source->Swift File 添加新的文件作为 xml 文件中不同项的数据模型。我们叫它 Book.swift,并替换成以下代码
import Foundation

class Book {
    var bookTitle: String = String()
    var bookAuthor: String = String()
}

前往 tableViewController.swift 文件,添加以下变量。

var books: [Book] = []
var eName: String = String()
var bookTitle = String()
var bookAuthor = String()

将 viewDidLoad 方法复写为
override func viewDidLoad() {
super.viewDidLoad()

    if let path = NSBundle.mainBundle().URLForResource("books", withExtension: "xml") {
        if let parser = NSXMLParser(contentsOfURL: path) {
            parser.delegate = self
            parser.parse()
        }
    }
}

NSXMLParser 对象解析 bundle 中的 books.xml 文件。添加以下 table View 的数据源及委托方法
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return books.count
}
    
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        
    let book = books[indexPath.row]
        
    cell.textLabel?.text = book.bookTitle
    cell.detailTextLabel?.text = book.bookAuthor

    return cell
}

所有书的标题和作者数据会保存在 books 数组中并且由 Table View 呈现。接着,实现 NSXMLParser 的委托方法。
// 1
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
eName = elementName
if elementName == "book" {
bookTitle = String()
bookAuthor = String()
}
}

// 2  
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    if elementName == "book" {
            
    let book = Book()
    book.bookTitle = bookTitle
    book.bookAuthor = bookAuthor
            
    books.append(book)
    }
}
    
// 3
func parser(parser: NSXMLParser, foundCharacters string: String) {
    let data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
        
    if (!data.isEmpty) {
        if eName == "title" {
            bookTitle += data
        } else if eName == "author" {
            bookAuthor += data
        }
    }
}
  1. 该方法在解析对象碰到 "<book>" 的起始标签时出触发
  2. 该方法在解析对象碰到 "<book>" 的结尾标签时出触发
  3. 这里解析过程真正执行。标题和作者标签会被解析并且相应的变量将会初始化。

构建并运行项目。在 TableViewController 中能看到所有书的标题和作者。

你可以在 Github 上下载本教程代码。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 每个人的背景不同,经历不同,可能20岁的时候有些人已经很成功,但大部分人的生活轨迹其实都是普普通通。20多岁的青涩...
    充电实践阅读 697评论 0 3
  • 这一波厉害了! 是来自(墨铭奇妙大社区最美腻最可爱的) Bunny的 19支千元以下钢笔测评 多图预警!!!!! ...
    墨铭奇妙阅读 11,333评论 4 52
  • 五月,有母体与我脐带的剪断 有五月的风浩荡刮了五年 有换来了劳苦者的觉悟纪念 有一片片香水百合的枯蔫 我拖着长长的...
    月亭阅读 351评论 9 12
  • 很多人用心做了很多事却成了落空,因为不甘心也一直念念不忘。故作地相信念念不忘必有回响,也在这念念不忘中执着...
    卢舒玲阅读 245评论 0 0