如何在Swift ios中解析XML和JSON输出?

jhkqcmku  于 2023-06-21  发布在  Swift
关注(0)|答案(3)|浏览(107)

我正在尝试解析soap api的输出。

<string xmlns="webservices.fmx.bz/">
{ "ui": [ { "t": "1234", "vid": "123", "cn": "Company Name" } ] }
</string>

我一直在手动解析它

var responseString = response.result.value?.stringByReplacingOccurrencesOfString("\r\n", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString("<string xmlns=\"webservices.fmx.bz/\">", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString("<?xml version=\"1.0\" encoding=\"utf-8\"?>", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString("</string>", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString("\"", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString( "{  ui: [    {      ", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString( "}  ]}", withString: "")
            responseString = responseString?.stringByReplacingOccurrencesOfString( "  ", withString: " ")
            var myStringArr = responseString?.componentsSeparatedByString(",")
            var companyNameStr = myStringArr![2].stringByReplacingOccurrencesOfString("cn:", withString: "")
            companyNameStr = companyNameStr.stringByReplacingOccurrencesOfString("&amp;", withString: "&")
            companyNameStr = companyNameStr.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
            NSUserDefaults.standardUserDefaults().setObject(companyNameStr, forKey: "companyName")

谁知道一个更简单的解决方案或库,我可以使用?

7fhtutme

7fhtutme1#

找到了方法必须清理数据字符串,然后转换回nsdata

Alamofire.request(.POST, emconOWO, parameters: params) .responseString { response in
        print("Success: \(response.result.isSuccess)")
//            print(response.result.value)

        var responseString = response.result.value?.stringByReplacingOccurrencesOfString("\r\n", withString: "")
        responseString = responseString?.stringByReplacingOccurrencesOfString("<string xmlns=\"webservices.fmx.bz/\">", withString: "")
        responseString = responseString?.stringByReplacingOccurrencesOfString("<?xml version=\"1.0\" encoding=\"utf-8\"?>", withString: "")
        responseString = responseString?.stringByReplacingOccurrencesOfString("</string>", withString: "")
     responseString = responseString?.stringByReplacingOccurrencesOfString("\\", withString: "")

        print(responseString)

  let data = responseString!.dataUsingEncoding(NSUTF8StringEncoding)
        do {
            if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
                print(jsonResult)
            }
wlsrxk51

wlsrxk512#

iOS提供了一个内置的JSON解析器,它可以完全解析JSON字符串,并构建一个表示JSON结构的字典。
但是,iOS没有为XML提供类似的方法。iOS提供的NSXMLParser使用“事件驱动”模型进行解析。ie:解析器将事件通知给委托,我们的工作是根据元素构建一个结构。
JSON方法相对更简单,因为我们可以简单地查询所需对象的解析数据结构。
然而,我发现有一个库在Swift中为XML执行类似的活动。你可以找到here
请检查它,您应该能够解析XML并使用它构建解析的对象。

aor9mmx1

aor9mmx13#

import UIKit
import Foundation
class ViewController: UIViewController {

    var parser:XMLParser?
    var foundChars: String = ""
    var personsStr: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        parseXML()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func parseXML() {
        let str: NSString = "<Data><Persons>[{\"ID\":\"2\",\"Name\":\"Catagory 1\"},{\"ID\":\"3\",\"Name\":\"Catagory 2\"}]</Persons><class>[{\"ID\":\"3\",\"Name\":\"WEAVING\"}]</class></Data>"
        if let data = str.data(using: String.Encoding.utf8.rawValue) {
            parser = XMLParser.init(data: data)
            parser!.delegate = self
            parser!.parse()
        }

    }
}
extension ViewController: XMLParserDelegate {
    public func parserDidEndDocument(_ parser: XMLParser) {
        debugPrint("Person str is:: " + self.personsStr)
        //TODO: You have to build your json object from the PersonStr now
    }
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        self.foundChars = self.foundChars + string
    }
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        debugPrint("end element::" + elementName)
        if (elementName == "Persons") {
            self.personsStr = self.foundChars
        }
        self.foundChars = ""
    }
}

相关问题