不在正确的格式中获取XML数据以在Swift中的表视图中显示

时间:2016-08-26 11:08:34

标签: ios objective-c swift xml-parsing

import UIKit
var operationViewFlag: Int!
var dataReceived: Int!

class HomeCellView: UITableViewCell
{

@IBOutlet weak var btn_tablecell_Delete: UIButton!
@IBOutlet weak var btn_tablecell_Edit: UIButton!
@IBOutlet weak var lbl_tablecell_Email: UILabel!
}

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, NSXMLParserDelegate
{
@IBOutlet weak var TableView_Mainscreen: UITableView!
@IBOutlet weak var lbl_MainScreen_Title: UILabel!
@IBOutlet weak var btn_Mainscreen_Insert: UIButton!

var databasepath:String!
var arrayStudInfo:NSMutableArray!



// for only xml parsing
var parser = NSXMLParser()
var posts = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var title1 = NSMutableString()
var date = NSMutableString()

// viewDidLoad
override func viewDidLoad()
{

    super.viewDidLoad()
    arrayStudInfo = NSMutableArray()        
    self.beginParsing();
    TableView_Mainscreen.reloadData()
}

//viewWillAppear
override func viewWillAppear(animated: Bool)
{
    super.viewWillAppear(true)
    TableView_Mainscreen.reloadData()
}

override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
}

// TableView Methods
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    print("Number Of Row:\(posts.count)")
    return posts.count

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let Cell = tableView.dequeueReusableCellWithIdentifier("CellHome") as! HomeCellView

    print("Index path - > \(posts[indexPath.row])")

    Cell.lbl_tablecell_Email.text! = String("\(posts[(indexPath.row)]["title"])")
    return Cell
}  
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
    element = elementName
    print("element Name : - \(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?)
{
    print("element Name : - \(elementName)")
    if (elementName as NSString).isEqualToString("item")
    {
        if !title1.isEqual(nil) {
            elements.setObject(title1, forKey: "Name")
        }
        if !date.isEqual(nil) {
            elements.setObject(date, forKey: "Level")
        }
        posts.addObject(elements)
    }
}

func parser(parser: NSXMLParser, foundCharacters string: String)
{
    if element.isEqualToString("Name")
    {
        title1.appendString(string)
    } else if element.isEqualToString("Level") {
        date.appendString(string)
    }
}
func beginParsing()
{
    posts = []
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://d1xzuxjlafny7l.cloudfront.net/downloads/Party.xml"))!)!

    parser.delegate = self
    parser.parse()
}

func parserDidEndDocument(parser: NSXMLParser) {
    TableView_Mainscreen.reloadData()
}
}

我想在适当的格式中显示xml api的结果。我想在表格视图中显示它的名称。现在我没有得到任何数据。首先如果将得到任何数据,然后我们可以考虑转换或安排在任何形式,但我没有得到任何东西。请有人帮忙。

1 个答案:

答案 0 :(得分:0)

修改

哦!我没有彻底检查你的XML!事实上,它与解析器异步加载数据无关(我将在下面留下关于parserDidEndDocument的原始提示,但是,一旦实现刷新功能,您可能需要它。)

原来你没有使用正确的名称,即元素的字符串。这是更正后的代码:

tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell中(注意我稍微改变了如何获取字符串,否则你可能会得到一个丑陋的前缀)

...
        let nameString = posts[(indexPath.row)]["Name"] as! String
        Cell.lbl_tablecell_Email.text = nameString
...

parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])

...
    if (elementName as NSString).isEqualToString("Player")
...

parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)

...
    if (elementName as NSString).isEqualToString("Player")
...

parser(parser: NSXMLParser, foundCharacters string: String)中(注意你的XML中似乎有一个换行符和一些空格,我将其删除了)

...
    if element.isEqualToString("Name") && !(string.hasPrefix("\n"))
...

我假设您没有意识到那些识别元素的字符串键实际上只是元素的名称,基本上。您的代码中有一些可以优化和/或改进的小东西(例如,您不需要初始化一些var,因为您只是在实际使用之前在其他地方重新启动它们,也是命名变量)。

我用您提供的链接尝试了它,现在可以正常使用。

先前回答的要点: 实施

func parserDidEndDocument(parser: NSXMLParser) {
    TableView_Mainscreen.reloadData()
}

这样可以确保在解析器完成解析后重新加载表的数据。