2014-11-23 30 views
11

Non so come analizzare nel mio codice seguente .. Qualcuno puòCome si analizza il servizio Web XML in 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, è un po 'insolito vedere la richiesta JSON e la risposta XML. Sei sicuro di questo? Inoltre, il 'data' restituito sembra un XML valido? – Rob

+0

sì, è ... ma dobbiamo chiamare il servizio web di terze parti dalla nostra app..so non possiamo cambiarlo .. @ rob, mi sto incollando la risposta xml qui sotto. Puoi controllare cosa potrebbe essere fatto ? –

+0

La mia risposta Xml sarà la seguente: false Utente non trovato nel sistema.

risposta

6

si dovrebbe usare il NSXMLParser nel gestore di completamento per la richiesta:

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 

Chiaramente, quanto sopra si presuppone che tu abbia (a) definito il tuo controller di visualizzazione per conformarsi a NSXMLParserDelegate e (b) aver implementato i metodi NSXMLParserDelegate, ad es. qualcosa di simile:

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

grazie Rob .. Oggi darò un'occhiata e ti faccio sapere. –

+0

grazie @Rob ... ha risolto il mio problema ..Un'altra domanda..quando sto stampando questo valore sulla mia funzione regolare 'callService' mi sta dando 'nil' .. come posso accedere a elementValue nel mio metodo ? –

+0

Bene, I' nil' the' elementValue' (in modo che 'foundCharacters' aggiunga caratteri solo tra' ' e ''). Se vuoi salvarlo, potresti teoricamente creare un'altra variabile, e salvare una copia di 'elementValue' all'interno di quell'istruzione' if elementName == success' di 'didEndElement'. (Nota, non _non_ basta rimuovere la riga che imposta 'elementValue' in' nil', in quanto ciò interromperà la mia routine: Salva il valore come descritto sopra.) Ma non so perché ti sentiresti come se avessi bisogno di salva il valore, dato che la variabile 'success' cattura se è stato trovato' true' o no ... – Rob

9

Per chi ancora alla ricerca, ecco il codice che ho usato che ha funzionato abbastanza bene per convertire la risposta XML in Dizionari/Array, grazie alla classe SWXMLHash ...

SWIFT AGGIORNATO 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

Non riesco a ottenere il dizionario da xml. –

+0

Grazie mille :) –

+1

Soluzione perfetta! Solo una piccola cosa: aggiungi "!" dopo i dati in: let xml = SWXMLHash.parse (dati!) –

0

ho usato classe creata qui sotto per ottenere dizionario Dai dati XML.

https://github.com/Bhaavik/BDXmlParser

È necessario aggiungere che la classe e basta chiamare Sotto funzione per la risposta dizionario

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

E qui si va con dizionario. :)

Problemi correlati