【问题标题】:Not Getting XML data in proper formate to display in Table View in Swift没有以正确的格式获取 XML 数据以在 Swift 的表视图中显示
【发布时间】:2017-01-03 01:02:17
【问题描述】:
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 的结果。我想在表格视图中显示它的名称。现在我没有得到任何数据。首先,如果会得到任何数据,然后我们可以考虑转换或以任何格式排列,但我没有得到任何东西。有人会帮忙吗?

【问题讨论】:

    标签: ios objective-c swift xml-parsing


    【解决方案1】:

    编辑:

    哦!我没有彻底检查您的 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"))
    ...
    

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

    我用你提供的链接试了一下,现在可以了。

    上一个答案的要点: 实施

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

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

    【讨论】:

    • 我已经编辑了我的代码。所以现在你会得到正确的想法。关于不获取数据
    • 如果你愿意,我也可以给你一个 git repo,向你展示你的代码中的小事。
    • 你确定你可以分享链接
    • 非常感谢亲爱的...现在可以正常工作了。我可以在我的项目中的 Table Veiw 中显示名称。太棒了。
    猜你喜欢
    • 2017-09-20
    • 2018-01-05
    • 1970-01-01
    • 2021-11-29
    • 2019-06-26
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多