swift中的XML解析不起作用,没有错误



我正试图直接从URL解析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://example.com/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://example.com/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()中重新加载表时,数据还没有被解析。

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

幸运的是,有一个回调。

beginParsing()中删除tbData!.reloadData(),并将此委托方法添加到视图控制器中:

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

最新更新