2014-11-23 15 views
11

nie wiem jak do analizowania w moim kodzie poniżej .. Może ktośJak przeanalizować usługę WWW XML w 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, to trochę niezwykłe widzieć prośbę JSON i odpowiedź XML. Czy jesteś tego pewien? Czy zwracane "dane" wyglądają jak poprawny XML? – Rob

+0

tak, jest ... ale musimy zadzwonić do strony trzeciej z naszej aplikacji ... więc nie możemy tego zmienić .. @ rob, wklejam odpowiedź xml poniżej .. Czy możesz sprawdzić, co można zrobić ? –

+0

Moja odpowiedź na Xml będzie następująca: false Użytkownik nie został znaleziony w systemie.

Odpowiedz

6

Należy użyć NSXMLParser w swojej obsługi zakończenie na życzenie:

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 

Oczywiście, powyższe zakłada, że ​​(a) zdefiniowałeś swój kontroler widoku, aby był zgodny z NSXMLParserDelegate i (b) wdrożył metody NSXMLParserDelegate, np. coś takiego:

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

dzięki Rob. Spojrzę dzisiaj i dam ci znać. –

+0

dzięki @Rob ... to rozwiązało mój problem .. Jeszcze jedno pytanie .. kiedy drukuję tę wartość na mojej zwykłej funkcji "callService", to daje mi "zero" ... jak mogę uzyskać dostęp do elementu ValueValue w mojej metodzie ? –

+0

Cóż, I 'nil' the" elementValue' (tak, że foundCharacters' będzie dołączać znaki tylko pomiędzy znacznikami '' i ''). Jeśli chcesz go zapisać, możesz teoretycznie stworzyć kolejną zmienną i zapisać kopię "elementuValue" wewnątrz instrukcji 'if elementName == success' z' didEndElement'. (Uwaga: _nie_ po prostu usuń linię, która ustawia 'elementValue' na' nil', ponieważ spowoduje to przerwanie mojej procedury: zapisz wartość tak, jak wskazałem powyżej). Ale nie wiem, dlaczego miałbyś ochotę zapisz wartość, ponieważ zmienna 'success' przechwytuje, czy' true' został znaleziony czy nie ... – Rob

9

Dla każdego, nadal szuka, tutaj jest kod, który pracował kiedyś całkiem dobrze konwertować odpowiedź XML do Słowniki/tablic, dzięki klasie SWXMLHash ...

AKTUALIZACJA 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

Nie mogę pobrać słownika z xml. –

+0

Wielkie dzięki :) –

+1

Idealne rozwiązanie! Tylko jedna mała rzecz: dodaj "!" po danych w: let xml = SWXMLHash.parse (dane!) –

0

Użyłem Class Utworzony poniżej Aby uzyskać słownik z danych XML.

https://github.com/Bhaavik/BDXmlParser

Trzeba dodać, że klasę i zadzwoń Poniżej funkcji dla słownika odpowiedzi

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

a tu iść z słownika. :)

Powiązane problemy