Fork me on GitHub

iOS-tutorial-7:解析XML(swift)

使用XMLParser解析XML文件,然后用table展示数据。

  • Single View Application模板新建项目XMLParserTutorial
  • 删除SB中的View Controller,拖进一个Navigation Controller。选择新的View Controller为 “Is Initial View Controller”。设置Navigation Bar的title为Books
  • 新建一个继承至UITableViewController,名为TableViewController的控制器文件,并与SB的控制器关联。
  • 新建一个xml文件Books.xml,用于之后解析,文件内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?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>
  • 新建一个文件 Book.swift

    1
    2
    3
    4
    5
    6
    import Foundation

    class Book {
    var bookTitle: String = ""
    var bookAuthor: String = ""
    }
  • TableViewController中添加几个变量:

    1
    2
    3
    4
    var books: [Book] = []
    var eName: String = ""
    var bookTitle = ""
    var bookAuthor = ""
  • viewDidLoad方法中,添加读取XMl文件代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    override func viewDidLoad() {
    super.viewDidLoad()

    if let path = Bundle.main.url(forResource: "Books", withExtension: "xml") {
    if let parser = XMLParser(contentsOf: path) {
    parser.delegate = self
    parser.parse()
    }
    }
  • 添加Table View的数据源代理方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return books.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

let book = books[indexPath.row]
cell.textLabel?.text = book.bookTitle
cell.detailTextLabel?.text = book.bookAuthor

return cell
}
  • TableViewController采纳XMLParserDelegate协议:

    class TableViewController: UITableViewController, XMLParserDelegate 
    
  • 实现XMLParserDelegate中的三个方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // 解析XMl元素开始时
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    print("开始 \(elementName)")
    eName = elementName
    if elementName == "book" {
    bookTitle = ""
    bookAuthor = ""
    }
    }
    // 正在解析XMl元素
    func parser(_ parser: XMLParser, foundCharacters string: String) {
    print("ing \(eName)")
    let data = string.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)

    if (!data.isEmpty) {
    if eName == "title" {
    bookTitle += data
    } else if eName == "author" {
    bookAuthor += data
    }
    }
    }
    // 结束解析XMl元素
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    print("结束 \(elementName)")
    if elementName == "book" {

    let book = Book()
    book.bookTitle = bookTitle
    book.bookAuthor = bookAuthor

    books.append(book)
    }
    }

三个方法分别在XMl元素开始解析、正在解析、结束解析时调用,也就是说有很多元素时就不停在调用这三个方法。

代码

XMLParserTutorial

参考:Parsing XML Tutorial

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文标题: iOS-tutorial-7:解析XML(swift)
  • 本文作者: AndyRon
  • 发布时间: 2017年07月31日 - 00:00
  • 最后更新: 2017年09月09日 - 11:23
  • 本文链接: http://andyron.com/2017/ios-tutorial-7-xml.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!