使用Alamofire的responsePropertyList解析XML报错,如何正确使用?
解析XML数据的错误修复方案
嘿,我来帮你搞定这个问题!你遇到的错误根源其实是用错了解析方式,咱们一步步理清楚:
为什么会报错?
你用了responsePropertyList来处理请求,但这个方法是专门用来解析Property List(.plist)格式数据的——这是苹果专属的序列化格式,和你请求的普通XML完全不是一回事。服务器返回的是标准XML,自然会被判定为格式错误。
正确的解决办法
根据你的需求,这里有两种靠谱的方案:
方案1:用系统XMLDecoder(iOS 13+/macOS 10.15+)
你的Note结构体已经实现了Codable,刚好可以用苹果在iOS13之后推出的XMLDecoder来直接解析XML,配合Alamofire的responseData获取原始数据即可:
import Alamofire import Foundation struct Note: Codable { var to: String? var from: String? var heading: String? var body: String? } let url = URL(string: "https://www.w3schools.com/xml/note.xml")! Alamofire.request(url, method: .get).responseData { response in guard let data = response.data, response.error == nil else { print(response.error ?? "Unknown error occurred") exp.fulfill() return } do { let decoder = XMLDecoder() // 因为XML的根节点就是<note>,和你的结构体名称一致,无需额外配置 let note = try decoder.decode(Note.self, from: data) print("解析成功:") print("To: \(note.to ?? "")") print("From: \(note.from ?? "")") print("Heading: \(note.heading ?? "")") print("Body: \(note.body ?? "")") } catch { print("解码失败:\(error.localizedDescription)") exp.fulfill() } }
方案2:用第三方XML解析库(兼容低版本系统)
如果需要支持iOS13以下的系统,推荐用SWXMLHash这个轻量的第三方库,步骤如下:
- 先通过CocoaPods安装:在Podfile里添加
pod 'SWXMLHash',然后执行pod install - 编写解析代码:
import Alamofire import SWXMLHash struct Note { var to: String? var from: String? var heading: String? var body: String? // 从XML节点初始化结构体 init?(xml: XMLIndexer) { self.to = xml["to"].element?.text self.from = xml["from"].element?.text self.heading = xml["heading"].element?.text self.body = xml["body"].element?.text } } let url = URL(string: "https://www.w3schools.com/xml/note.xml")! Alamofire.request(url, method: .get).responseData { response in guard let data = response.data, response.error == nil else { print(response.error ?? "Unknown error occurred") exp.fulfill() return } let xml = SWXMLHash.parse(data) if let note = Note(xml: xml["note"]) { print("解析成功:") print("To: \(note.to ?? "")") print("From: \(note.from ?? "")") print("Heading: \(note.heading ?? "")") print("Body: \(note.body ?? "")") } else { print("解析失败:无法从XML提取数据") exp.fulfill() } }
额外提醒
- 永远不要混淆
PropertyList和普通XML:responsePropertyList只认苹果的plist格式(不管是二进制还是XML版的plist),普通XML完全不适用。 - 如果你的服务器返回的是plist数据,那用
responsePropertyList才是正确的,但显然你现在的场景不是。
内容的提问来源于stack exchange,提问作者SleepNot
相关产品推荐
相关产品推荐

