MyXMLParser.swift
Код: Выделить всё
import Foundation
struct Order {
var orderID: String!
var productCode: String!
}
class MyXMLParser: NSObject, XMLParserDelegate{
private var orders = [Order]()
private var currentElement: String = ""
private var currentID: String = "" {
didSet {
currentID = currentID.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
private var currentProdCode: String = "" {
didSet {
currentProdCode = currentProdCode.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
private var parserCompletionHandler: (([Order]) -> Void)?
func parseFeed(stringURL: String, completionHandler: (([Order]) -> Void)?) {
self.parserCompletionHandler = completionHandler
if let encodedString = stringURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let validURL = URL(string: encodedString)
{
let request = URLRequest(url: validURL)
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: request) { (data, responds, error) in
if let validData = data
{
//parse XML Data
let parser = XMLParser(data: validData)
parser.delegate = self
parser.parse()
}
else
{
print("do not have data received")
}
}
task.resume()
}
else
{
print("unable to create url")
}
}
// MARK: - XML Parser functions
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentElement = elementName
if currentElement == "Orders"{
currentID = ""
currentProdCode = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
switch currentElement {
case "OrderID":
if currentID == "" {
currentID += string
}
case "ProductCode":
currentProdCode += string
default:
break
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "Orders" {
let order = Order(orderID: currentID, productCode: currentProdCode)
self.orders.append(order)
}
}
func parserDidEndDocument(_ parser: XMLParser) {
parserCompletionHandler?(orders)
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("Error when parsing Falcon XML, \(parseError.localizedDescription) ")
}
}
Код: Выделить всё
import UIKit
class XMLTableViewController: UITableViewController, XMLParserDelegate {
private let testURL = "http://www.XXXX.com/....."
var orders = [Order]()
override func viewDidLoad() {
super.viewDidLoad()
fetchData()
print("test3:", self.orders)
}
func fetchData(){
let myParser = MyXMLParser()
myParser.parseFeed(stringURL: testURL) { (orders) in
print("test1: ", orders)
self.orders = orders
print("test2: ", self.orders)
OperationQueue.main.addOperation {
self.tableView.reloadSections(IndexSet(integer: 0), with: .left)
}
}
print("test:", self.orders)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 0
}
Код: Выделить всё
test: []
test3: []
test1: [XXXXXXX.Order(orderID: Optional("8963"), productCode: Optional("182SLD-UFPLP-B"))]
test2: [XXXXXXX.Order(orderID: Optional("8963"), productCode: Optional("182SLD-UFPLP-B"))]
Код: Выделить всё
self.orders = orders
Пожалуйста, помогите мне, я ценю это.
Подробнее здесь: https://stackoverflow.com/questions/590 ... rray-swift