簡體   English   中英

swift中的XML解析不起作用,沒有錯誤

[英]XML parsing in swift not working, no errors

我試圖直接從URL解析xml文件代碼沒有錯誤,應用程序打開正常但tableview為空。 這里是鏈接和我使用的代碼,如果我能得到一些指導,將不勝感激。

https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml

我最初是通過教程構建的(只是學習繩索)

import UIKit

class firecallViewController: UIViewController, NSXMLParserDelegate{

@IBOutlet var tbData: UITableView?


var parser = NSXMLParser()
var posts = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var title1 = NSMutableString()
var date = NSMutableString()

override func viewDidLoad()
{
    super.viewDidLoad()
    self.beginParsing()
}

func beginParsing()
{
    posts = []
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml"))!)!
    parser.delegate = self
    parser.parse()
    tbData!.reloadData()
}

//XMLParser Methods

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
    element = elementName
    if (elementName as NSString).isEqualToString("item")
    {
        elements = NSMutableDictionary()
        elements = [:]
        title1 = NSMutableString()
        title1 = ""
        date = NSMutableString()
        date = ""
    }
}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
{
    if (elementName as NSString).isEqualToString("item") {
        if !title1.isEqual(nil) {
            elements.setObject(title1, forKey: "title")
        }
        if !date.isEqual(nil) {
            elements.setObject(date, forKey: "date")
        }

        posts.addObject(elements)
    }
}

func parser(parser: NSXMLParser, foundCharacters string: String)
{
    if element.isEqualToString("title") {
        title1.appendString(string)
    } else if element.isEqualToString("pubDate") {
        date.appendString(string)
    }
}


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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell")!

    if(cell.isEqual(NSNull)) {
        cell = NSBundle.mainBundle().loadNibNamed("Cell", owner: self, options: nil)[0] as! UITableViewCell;
    }

    cell.textLabel?.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String
    cell.detailTextLabel?.text = posts.objectAtIndex(indexPath.row).valueForKey("date") as! NSString as String

    return cell as UITableViewCell
    }
}

更新的答案

你在評論中告訴我你不必使用NSXMLParser。

在這種情況下,我有一個簡單的解析解決方案:使用CheatyXML ,一個非常簡單的庫。

首先,按照簡單的安裝說明進行操作

然后使用您的URL創建一個解析器:

import CheatyXML

let feedUrl = NSURL(string: "https://www.ruralfire.qld.gov.au/bushfirealert/bushfireAlert.xml")!
let parser = XMLParser(contentsOfURL: feedUrl)

並安全地解開所有值,就像您正在下載字典一樣,並使用.string屬性來獲取字符串字段內容。

像這樣:

if let parser = parser,
    channel = parser["channel"],
    title = channel["title"].string,
    link = channel["link"].string,
    description = channel["description"].string,
    docs = channel["docs"].string,
    generator = channel["generator"].string {
        print(title)
        print(link)
        print(description)
        print(docs)
        print(generator)
}

結果:

QFES當前事件
HTTP://bneags01.desqld.internal/publicfeed/PublicRssFeed.aspx
QFES當前事件
http://www.rssboard.org/rss-specification
Argotic Syndication Framework

現在,而不是我的系列print你調用你的方法來填充你的變量,然后你重新加載表視圖,然后你設置。


老答案

的NSXMLParser以異步方式工作,所以當你在刷新你的表beginParsing()該數據尚未解析。

解析器完成解析后,您需要重新加載表。

幸運的是,有一個回調。

刪除tbData!.reloadData()beginParsing()和該委托的方法添加到您的視圖控制器來代替:

func parserDidEndDocument(parser: NSXMLParser) {
    tbData!.reloadData()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM