【问题标题】:Parsing a REST XML API response解析 REST XML API 响应
【发布时间】:2016-07-07 14:24:31
【问题描述】:

我目前正在尝试解析来自 STANDS4 api 的 rest xml api 响应...

XML 文件看起来像这样:

<results>
  <result>
    <quote>
      To be free it is not enough to beat the system, one must beat the system every day.
    </quote>
    <author>Anonymous</author>
  </result>
</results>

我想要做的是能够打印出 XML 响应并能够将引用和作者分配给 UILabel。我目前拥有的是以下代码(我有我的用户 ID 和我的令牌 ID)

import UIKit

class ViewController: UIViewController,NSXMLParserDelegate {

    var strXMLData:String = ""
    var currentElement:String = ""
    var passData:Bool=false
    var passName:Bool=false
    var parser = NSXMLParser()


    @IBOutlet weak var lblNameData: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()

        let url:String="http://www.stands4.com/services/v2/quotes.php?uid=youridhere&tokenid=youridherezf&searchtype=AUTHOR&query=Albert+Einstein"
        let urlToSend: NSURL = NSURL(string: url)!
        // Parse the XML
        parser = NSXMLParser(contentsOfURL: urlToSend)!
        parser.delegate = self

        let success:Bool = parser.parse()

        if success {
            print("parse success!")

            print(strXMLData)

            lblNameData.text=strXMLData

        } else {
            print("parse failure!")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        currentElement=elementName;
        if(elementName=="id" || elementName=="name" || elementName=="cost" || elementName=="description")
        {
            if(elementName=="name"){
                passName=true;
            }
            passData=true;
        }
    }

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        currentElement="";
        if(elementName=="id" || elementName=="name" || elementName=="cost" || elementName=="description")
        {
            if(elementName=="name"){
                passName=false;
            }
            passData=false;
        }
    }

    func parser(parser: NSXMLParser, foundCharacters string: String) {
        if(passName){
            strXMLData=strXMLData+"\n\n"+string
        }

        if(passData)
        {
            print(string)
        }
    }

    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        NSLog("failure error: %@", parseError)
    }
}

我目前得到解析成功但没有打印出来的响应。我从本教程中得到了上面的代码: http://ashishkakkad.com/2014/10/xml-parsing-in-swift-language-ios-9-nsxmlparser/

所以我很可能需要进行一些更改才能使用我当前的 API,但我不确定具体要做什么。

感谢任何帮助!

【问题讨论】:

    标签: ios xml swift api rest


    【解决方案1】:

    您的第一个问题是您的 XMLParsing 函数从不查找正确的元素名称(假设您的示例 xml 正是您得到的)。您的 XML 解析正在寻找“id”、“name”、“cost”或“description”。您的示例 XML 提供“引用”和“作者”。您需要通过 XML 解析函数进行调试,并在使用它们之前了解它们实际在做什么。那你应该很高兴了。

    【讨论】:

    • 感谢先生的帮助。按照您的建议,我能够获得所需的信息,但无法将数据分配给 UILabel。我的报价存储在 strXMLData(一个字符串)中,我想将它存储在一个名为 lblNameData 的 UILabel 中。但是,当我执行 lblNamedata.text = strXMLData 时,什么都没有显示(我打印了 strXMLData 以确保我得到的信息是报价,所以我不太确定我做错了什么)跨度>
    • 确保将文本设置为 UI(主)线程中的标签。此外,请尝试在任何其他时间将标签文本设置为任何内容,以确保标签文本实际工作并在屏幕上可见。
    • 我正在更新 viewdidLoad() 函数中的 UILabel。我尝试使用 lblNamedata.text = "hello" 将文本更新为“hello”,并成功显示/更新到屏幕上。但是,它仍然不适用于 lblNamedata.text = strXMLData(此语句与我原来的帖子中的位置相同)
    • 哦,我确实尝试了 dispatch_async(dispatch_get_main_queue()) { self.lblNameData.text=self.strXMLData } 但这也没有用:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多