0

我是 Swift 新手,正在编写我的第一个带有网络请求的应用程序。出于测试目的,我使用框架 Alamofire 和 SWXMLHash 创建了一个应用程序,用于解析请求中的 xml 数据。

总的来说,它工作得很好(或多或少,我不知道如何为 Alamofire 使用 completionHandler,我什至不明白那到底是什么......真丢脸

但现在这是我的 xml-Structure 第一次有多个同名项目,我想使用它们的“名称”属性将它们全部迭代到一个数组中。

让我举一个 XML 的例子:

<Root>
  <Results>
   <Url Name="Test1"></Url>
   <Url Name="Test2"></Url>
   <Url Name="Test3"></Url>
  </Results>
</Root>

所以我的数组应该是这样的:

["Test1", "Test2", "Test3"]

到目前为止,我的代码无法正常工作......我收到一个错误,解开 xml 数据返回 nil。这是整个文件的代码:

import WatchKit
import Foundation
import Alamofire
import SWXMLHash

public var url = "http://www.testurl.com"
public var user = "testuser"

class InterfaceController: WKInterfaceController {

 @IBAction func selectedAccountActivate() {
        campaignLister()
    }

    func campaignLister(){
        Alamofire.request(.GET, url, parameters: ["function":"catalog", "user":user, "pwd":"1234"])
            .response { (request, response, data, error) in
                //print(response)
                let xml = SWXMLHash.parse(data!)

                var xml2: [String] = []

                for elem in xml["Root"]["Results"] {

/以下行给了我错误。当我发出一个只有一个“URL”元素的请求时它可以工作,但是一旦我在这个例子中有很多类似的东西,我的应用程序就会崩溃/

xml2.append(elem["Url"].element!.attributes["Name"]!) } print(xml2) } }

    override func willActivate() {
        super.willActivate()
    }

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
    }

    override func didDeactivate() {
        super.didDeactivate()
    }

}

谁能帮我吗?我经常使用谷歌来解决这个问题,但我没有找到任何解决方案。特别是因为我对 Swift 真的很陌生……

此致,

哈勒龙

(抱歉,您可能会发现语法错误,英语不是我的母语。)

4

1 回答 1

1

我认为您真正想要做的是遍历 Url 元素,如下所示:

for elem in xml["Root"]["Results"]["Url"].all {
    let urlValue = elem.element!.attributes["Name"]!;
}

您正在循环结果元素,但听起来总会有其中之一。

希望这可以帮助。

于 2016-01-09T18:49:08.527 回答