在快速的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
}
}
更新答案
建这个,你告诉我,你不必评论使用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()
}
好吧,我已经玩了一段时间,现在我可以摆脱错误,并编译,但我得到零数据显示。我想我可能只是从第一个方块开始。 –
在'parserDidEndDocument'中添加'print(“done”)'(或断点)来验证控制流是否按预期进行。它将帮助调试实际问题。 – Moritz
完全没有,正如我刚才所说的那样,我显然做了一些错误的事情,因为这里是我修改后的代码。 –
你调试代码,看看它去和它做什么和它做什么呢? – FredericP
如果本教程在'parser:didStartElement:'中寻找那些可怕的初始化:寻找更好的初始化。 – vadian