我解析XML时显示错误消息

时间:2017-09-09 14:22:58

标签: ios swift xml-parsing

我是Swift编程的新手。我有2个类来解析RSS并显示数据。它的名称为ParseRSSFeedDetailVC。但是当我想要解析时,我无法在TableView中看到数据。

但是,如果我在XMLParserDelegate中调用DetailVC的方法,则可行。可能在从另一个类调用方法时我犯了一个错误。

我的代码如下。

我忽略了什么?

ParseRSSFeeds类解析XML

import UIKit

class ParseRSSFeeds: XMLParser, XMLParserDelegate{
    var parser = XMLParser()
    var news = NSMutableArray()
    var elements = NSMutableDictionary()
    var element = NSString()
    var header = NSMutableString()
    var link = NSMutableString()
    var desc = NSMutableString()
    var date = NSMutableString()

    func parseFromUrl(){
        news = []
        parser = XMLParser(contentsOf: NSURL(string: "https://www.wired.com/feed/rss")! as URL)!
        parser.delegate = self
        parser.parse()
    }

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        element = elementName as NSString

        if (elementName as NSString) .isEqual(to: "item") {
            elements = NSMutableDictionary()
            elements = [:]
            header = NSMutableString()
            header = ""
            link = NSMutableString()
            link = ""
            desc = NSMutableString()
            desc = ""
            date = NSMutableString()
            date = ""
        }
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {
        if element .isEqual(to: "title"){
            header.append(string)
        }else if element .isEqual(to: "link"){
            link.append(string)
        }else if element .isEqual(to: "description"){
            desc.append(string)
        }else if element .isEqual(to: "pubDate") {
            date.append(string)
        }
    }

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if (elementName as NSString) .isEqual(to: "item") {
            if !header .isEqual(nil) {
                elements.setObject(header, forKey: "title" as NSCopying)
            }
            if !link .isEqual(nil) {
                elements.setObject(link, forKey: "link" as NSCopying)
            }
            if !desc .isEqual(nil) {
                elements.setObject(desc, forKey: "description" as NSCopying)
            }
            if !date .isEqual(nil) {
                elements.setObject(date, forKey: "pubDate" as NSCopying)
            }

            news.add(elements)
        }
    }
}

DetailVC(它包括显示RSS源的表格视图。)

import UIKit

class DetailVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tblNews: UITableView!

    let parser = ParseRSSFeeds()

    override func viewDidLoad() {
        super.viewDidLoad()

        ParseRSSFeeds().parseFromUrl()
        tblNews.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return parser.news.count - parser.news.count + 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tblNews.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        if cell .isEqual(NSNull.self) {
            cell = Bundle.main.loadNibNamed("cell", owner: self, options: nil)?[0] as! UITableViewCell
        }

        cell.textLabel?.text = (parser.news.object(at: indexPath.row) as AnyObject).value!(forKey: "title") as? String
        cell.detailTextLabel?.text = (parser.news.object(at: indexPath.row) as AnyObject).value!(forKey: "description") as? String

        return cell
    }
}

1 个答案:

答案 0 :(得分:0)

您有两个ParseRSSFeeds个实例,parser属性以及您在viewDidLoad中创建的属性。因此,viewDidLoad正在创建ParseRSSFeeds的第二个实例,请求并解析响应,然后丢弃这些结果,保持单独的parser属性不变。

您应该viewDidLoad引用parser属性,而不是创建ParseRSSFeeds的新实例:

override func viewDidLoad() {
    super.viewDidLoad()

    parser.parseFromUrl()
    ...
}