2014-11-23 13 views
11

Tôi không biết làm thế nào để phân tích trong mã dưới đây của tôi .. Có thể ai đóLàm cách nào để phân tích cú pháp dịch vụ web XML trong Swift?

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

BTW, có một chút bất thường khi thấy yêu cầu JSON và phản hồi XML. Bạn có chắc chắn về điều đó không? Ngoài ra, dữ liệu 'trả về có giống như XML hợp lệ không? – Rob

+0

vâng, đó là ... nhưng chúng tôi cần gọi dịch vụ web của bên thứ ba từ ứng dụng của chúng tôi..vì vậy, chúng tôi không thể thay đổi nó .. @ rob, tôi đang dán phản hồi xml của tôi bên dưới .. Bạn có thể kiểm tra những gì có thể được thực hiện ? –

+0

Phản hồi Xml của tôi sẽ như sau: false Không tìm thấy người dùng trong hệ thống.

Trả lời

6

Bạn nên sử dụng NSXMLParser trong xử lý hoàn thành của bạn cho các yêu cầu:

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 

Rõ ràng, ở trên giả sử rằng bạn đã (a) xác định bộ điều khiển xem của bạn để phù hợp với NSXMLParserDelegate và (b) đã triển khai các phương pháp NSXMLParserDelegate, ví dụ cái gì đó như:

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

nhờ Rob..I sẽ có một cái nhìn ngày hôm nay và cho bạn biết. –

+0

thanks @Rob ... nó đã giải quyết được vấn đề của tôi..Chỉ cần thêm một câu hỏi nữa .. khi tôi in giá trị này trên chức năng thường xuyên của tôi 'callService', nó cho tôi 'nil' ..làm cách nào tôi có thể truy cập elementValue trong phương thức của tôi ? –

+0

Vâng, tôi 'nil'' elementValue' (để 'foundCharacters' sẽ chỉ thêm các ký tự giữa các thẻ' 'và' '). Nếu bạn muốn lưu nó, bạn về mặt lý thuyết có thể tạo một biến khác, và lưu một bản sao của 'elementValue' bên trong câu lệnh' if elementName == success' của 'didEndElement'. (Lưu ý, làm _not_ chỉ cần loại bỏ dòng đặt 'elementValue' thành' nil', vì điều đó sẽ phá vỡ thường trình của tôi: Lưu giá trị như tôi đã nêu ở trên.) Nhưng tôi không biết tại sao bạn lại muốn bạn cần lưu giá trị, vì biến 'success' nắm bắt liệu' true' đã được tìm thấy hay chưa ... – Rob

9

Đối với bất cứ ai vẫn nhìn, đây là mã tôi đã sử dụng mà làm việc khá tốt để chuyển đổi các phản ứng xml vào Từ điển/Mảng, nhờ vào lớp SWXMLHash ...

CẬP NHẬT 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

Tôi không thể lấy từ điển từ xml. –

+0

Cảm ơn rất nhiều :) –

+1

Giải pháp hoàn hảo! Chỉ một điều nhỏ: thêm "!" sau khi dữ liệu trong: let xml = SWXMLHash.parse (dữ liệu!) –

0

Tôi đã sử dụng Lớp được tạo bên dưới Để lấy từ điển Từ dữ liệu XML.

https://github.com/Bhaavik/BDXmlParser

bạn cần phải thêm rằng lớp và chỉ cần gọi Dưới Chức năng cho phản ứng từ điển

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

Và đây Bạn đi với từ điển. :)

Các vấn đề liên quan