You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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这个轻量的第三方库,步骤如下:

  1. 先通过CocoaPods安装:在Podfile里添加pod 'SWXMLHash',然后执行pod install
  2. 编写解析代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:49