2014-11-23 88 views
11

我不知道怎样在我下面的代码解析.. 有人能如何解析Swift中的XML Web服务?

func callService(usr: String, pwdCode: String) { 

    let url = NSURL(string: "http://inspect.dev.cbre.eu/SyncServices/api/jobmanagement/PlusContactAuthenticationPost") 
    var xmlParse:NSString = "" 
    var data : NSData! 
    let request = NSMutableURLRequest(URL: url!) 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
    request.HTTPMethod = "POST" 
    let dictionary = ["email": usr, "userPwd": pwdCode] 
    var error: NSError? 
    if let body = NSJSONSerialization.dataWithJSONObject(dictionary, options: nil, error: &error) { 
     request.HTTPBody = body 
    } else { 
     println("JSON error: \(error)") 
    } 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     (data, response, error) in 
     println(NSString(data: data, encoding: NSUTF8StringEncoding)) 

     // xmlParse=NSString(data: data, encoding: NSUTF8StringEncoding)! 
     // let data = (xmlParse as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
     // NSXMLParser(data : NSData) 

     // xmlParse=NSString(data: data, encoding: NSUTF8StringEncoding)! 
     // xmlParse=response 
     // println(xmlParse) 
    } 
    task.resume() 

} 
+1

顺便说一句,看到JSON请求和XML响应有点不寻常。你确定吗?另外,返回的'data'看起来像有效的XML吗? – Rob 2014-11-23 12:27:21

+0

是的,这是......但我们需要从我们的应用程序调用第三方web服务..所以我们不能改变它.. @ rob,我粘贴下面的xml响应..可以检查一下可以做什么? – 2014-11-24 11:14:46

+0

我的XML响应将是这样的:<?XML版本= “1.0” 编码= “UTF-8”?>在系统中没有发现假用户 2014-11-24 11:15:17

回答

6

你应该在你完成处理程序使用NSXMLParser的要求:

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
    (data, response, error) in 

    if data == nil { 
     println("dataTaskWithRequest error: \(error)") 
     return 
    } 

    let parser = NSXMLParser(data: data) 
    parser.delegate = self 
    parser.parse() 

    // you can now check the value of the `success` variable here 
} 
task.resume() 

// but obviously don't try to use it here here 

显然,上述假设您(a)已将视图控制器定义为符合NSXMLParserDelegate和(b)已实施NSXMLParserDelegate方法,例如是这样的:

var elementValue: String? 
var success = false 

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { 
    if elementName == "success" { 
     elementValue = String() 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String?) { 
    if elementValue != nil { 
     elementValue! += string 
    } 
} 

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
    if elementName == "success" { 
     if elementValue == "true" { 
      success = true 
     } 
     elementValue = nil 
    } 
} 

func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) { 
    println("parseErrorOccurred: \(parseError)") 
} 
+0

感谢Rob..I今天看看并让您知道。 – 2014-11-24 12:40:11

+0

感谢@Rob ...它已经解决了我的问题..只是当我在常规函数'callService'上打印这个值时,它给了我'零'..我怎样才能访问我的方法中的elementValue ? – 2014-11-25 12:35:58

+0

嗯,我'nil'了'elementValue'(这样'foundCharacters'将只能在''和''标签之间添加字符)。如果你想保存它,理论上你可以创建另一个变量,并在'didEndElement'的if元素==成功声明中保存'elementValue'的副本。 (请注意,不要仅仅删除将'elementValue'设置为'nil'的那一行,因为这会破坏我的例程:保存上面所述的值。)但是我不知道为什么你会觉得你需要保存值,因为'success'变量捕获是否发现了'true' ... – Rob 2014-11-25 14:16:41

9

对于任何人还在寻找,这里是我用的是做得很不错来转换XML响应到字典/数组的代码,这要归功于SWXMLHash类...

修订SWIFT 2.0

let baseUrl = "http://www.example.com/file.xml" 
    let request = NSMutableURLRequest(URL: NSURL(string: baseUrl)!) 
    let session = NSURLSession.sharedSession() 
    request.HTTPMethod = "GET" 

    var err: NSError? 

    let task = session.dataTaskWithRequest(request) { 
     (data, response, error) in 

     if data == nil { 
      print("dataTaskWithRequest error: \(error)") 
      return 
     } 

     let xml = SWXMLHash.parse(data) 

     if let definition = xml["entry_list"]["entry"][0]["def"].element?.text { 
      // ... 
     } 

     dispatch_async(dispatch_get_main_queue(),{ 
      // use main thread for UI updates 
     }) 

    } 
    task.resume() 
+0

我无法从xml获取字典。 – 2015-11-26 13:03:20

+0

非常感谢:) – 2015-12-14 13:39:04

+1

完美的解决方案!只有一件小事:添加“!”数据之后:let xml = SWXMLHash.parse(data!) – 2016-06-22 11:55:42

0

我已经使用下面创建的类来获取XML数据字典。

https://github.com/Bhaavik/BDXmlParser

您需要添加类 并调用下面函数字典响应

let objXmlParser = BbXmlParser() 
    let dictResponse = objXmlParser.getdictionaryFromXmlData(data!) 
         print(dictResponse) 

,在这里你去解释。 :)