使用Alamofire和SWXMLHash解析xml时出现错误

3
我正在使用Swift 4与pods。
pod 'SWXMLHash', '~> 4.0.0'
pod 'Alamofire', '~> 4.5'

当我使用以下代码解析XML时,会出现错误:

Type 'XMLIndexer' does not conform to protocol 'Sequence'

代码:

Alamofire.request("https://itunes.apple.com/us/rss/topgrossingapplications/limit=10/xml").response { response in
            debugPrint(response)

            guard let data = response.data else {
                return
            }

            let xml = SWXMLHash.parse(data)
            let nodes = xml["feed"]["entry"]
            for node in nodes {
                print(node["title"].text)
            }
        }

我试图从上述iTunes XML URL中访问“entry”标记列表。如果有方法可以访问和初始化类/结构中的条目列表,请帮忙。
2个回答

3
根据文档,您需要添加all
Alamofire.request("https://itunes.apple.com/us/rss/topgrossingapplications/limit=10/xml").response { response in
        debugPrint(response)

        guard let data = response.data else {
            return
        }

        let xml = SWXMLHash.parse(data)
        let nodes = xml["feed"]["entry"]
        for node in nodes.all {
            print(node["title"]?.text)
        }
    }

这是正确的 - 当 Swift 4 推出时,序列协议发生了重大变化,因此该协议被删除,以支持调用 all 方法。 - David Mohundro
我尝试使用Alamofire.request("https://itunes.apple.com/us/rss/topgrossingapplications/limit=10/xml")进行请求。.response { response in debugPrint(response) guard let data = response.data else { return completion(.Failure("未找到天气信息")) } let xml = SWXMLHash.parse(data) let nodes = xml["feed"]["entry"] for node in nodes.all { print(node["title"].description) } } - Asif Raza
1- po xml ▿ ▿ element : <SWXMLHash_Root_Element></SWXMLHash_Root_Element>2- po xml["feed"] ▿ ▿ xmlError : XML 元素错误:不正确的键 ["feed"] - key : "feed"3- po xml["feed"]["entry"] ▿ ▿ xmlError : XML 元素错误:不正确的键 ["entry"] - key : "entry" - Asif Raza
请详细说明您的问题。您在评论中写的内容无法阅读。 - sundance

1
另一种解决方案是使用Fuzi,它基于Ono框架,拥有很好的支持。
以下代码片段将打印标题:
Alamofire.request("https://itunes.apple.com/us/rss/topgrossingapplications/limit=10/xml").responseString { response in
    guard let xml = try? XMLDocument(string: response.value ?? "") else {
        return
    }
    guard let feed = xml.root else {
        return
    }
    for entry in feed.children(tag: "entry") {
        let title = entry.firstChild(tag: "title")?.stringValue ?? ""
        print(title)
    }
}

当我从服务器返回响应后解析另一个XML时,我会得到一些符号性响应,就像下面这样:- XML:<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <items><title> [Hindi] लखनऊ, वाराणसी, पटना, गया में सीज़न का सबसे कम न्यूनतम तापमान, दिन में मिलेगी राहत, रात में बढ़ेगी सर्दी </title> <articledate>05 January, 2018</articledate> </items> </urlset> - Asif Raza
它包含一些印度语言(如印地语、泰米尔语)的内容,如上面的评论所述。当我尝试打印时,它会打印出一些象征性的字符,例如:- po entry.firstChild(tag: "title")?.stringValue ▿ 可选字符串
  • some : "[Hindi] लक्षण, वाराणसी, पंना, अया मिल सन अम नयनतम तापमान, दिन मिल मिल राहत, रात मिल बारिश"
- Asif Raza

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