在快速的XML解析不工作,没有错误

问题描述:

我想直接从URL解析XML文件的代码没有错误,并且应用程序打开正常,但tableview是空的。这里是链接和我使用的代码,如果我能得到一些指导,将不胜感激。在快速的XML解析不工作,没有错误

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 
    } 
} 
+0

你调试代码,看看它去和它做什么和它做什么呢? – FredericP

+1

如果本教程在'parser:didStartElement:'中寻找那些可怕的初始化:寻找更好的初始化。 – vadian

更新答案

建这个,你告诉我,你不必评论使用NSXMLParser。

在这种情况下,我有一个简单的解决方案来解析:使用CheatyXML,一个非常简单的库。

首先,请按照易install intructions

然后做一个解析器与你的网址:

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聚合框架

现在,而不是我的系列print你调用你的方法填充你的变量,然后你重新加载表视图,并设置。


老答案

的NSXMLParser以异步方式工作,所以当你在beginParsing()刷新你的表中的数据不会被解析尚未

当解析器完成解析时,您需要重新加载表

幸运的是,有一个回调。

取下beginParsing()tbData!.reloadData()与此委托方法添加到您的视图控制器来代替:

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

好吧,我已经玩了一段时间,现在我可以摆脱错误,并编译,但我得到零数据显示。我想我可能只是从第一个方块开始。 –

+0

在'parserDidEndDocument'中添加'print(“done”)'(或断点)来验证控制流是否按预期进行。它将帮助调试实际问题。 – Moritz

+0

完全没有,正如我刚才所说的那样,我显然做了一些错误的事情,因为这里是我修改后的代码。 –