如何在Swift中解析XML Web服务?

12
我不知道如何解析下面代码中的内容。 有人可以帮忙吗?
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
是的,这是...但我们需要从我们的应用程序调用第三方Web服务...所以我们无法更改它...@rob,我在下面粘贴了我的XML响应..你能看看有什么可以做的吗? - dhaval shah
我的Xml响应将是这样的:<?xml version="1.0" encoding="utf-8"?><serviceresult><success>false</success><resultmessage>系统中找不到用户。</resultmessage></serviceresult> - dhaval shah
请查看我的项目,轻松解析Swift中的XML:https://github.com/borchero/WebParsing - borchero
3个回答

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()

我无法从XML中获取字典。 - Developer007
1
完美的解决方案!只有一个小问题:在以下代码中添加 "!":let xml = SWXMLHash.parse(data!) - Ruben Marin

7

在请求的完成处理程序中,您应该使用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)")
}

谢谢 Rob。我今天会看一下并告诉你。 - dhaval shah
谢谢@Rob...它解决了我的问题..只有一个问题..当我在我的常规函数'callService'中打印这个值时,它会给我返回'nil'..我该如何在我的方法中访问elementValue? - dhaval shah
好的,我将elementValue设置为nil(这样foundCharacters就只会追加在<success></success>标签之间的字符)。如果您想要保存它,理论上您可以创建另一个变量,并在didEndElement中的if elementName == success语句中保存elementValue的副本。(请注意,不要仅删除将elementValue设置为nil的行,因为那会破坏我的程序:请按照我上面概述的方式保存该值。)但是我不知道为什么您觉得需要保存该值,因为success变量捕获了是否找到了true... - Rob
嗨,罗布。你能给我你的电子邮件地址吗?我想把我的整个代码给你,看看我是否漏掉了什么。因为当我将“success”声明为全局变量时,它会给我错误的结果。 - dhaval shah
将其发布到gist.github.com、pastie.org或类似的网站上。 - Rob

0
我使用下面创建的类从XML数据中获取字典。

https://github.com/Bhaavik/BDXmlParser

你需要添加那个类,并且只需调用下面的函数来获取字典响应。
  let objXmlParser = BbXmlParser()
  let  dictResponse  =  objXmlParser.getdictionaryFromXmlData(data!)
                        print(dictResponse)

这里是您要的字典,祝使用愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接