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

Swift4中使用XMLMapper解析XML数组失败,求问题排查与解决

解决XMLMapper解析decimal数组的问题

嘿,我来帮你排查下问题所在~你现在遇到的问题主要是模型映射的路径和节点解析逻辑搞错了,下面给你详细分析和修正方案:

问题根源

你的XML结构是外层<RandomDecimals>包裹着多个<decimal>子节点,但你在Response类的映射里犯了两个小错误:

  • 用了map["RandomDecimals.decimal"]去映射[DecimalElement]数组,但每个DecimalElement本来就对应一个<decimal>节点,这个路径相当于在找<RandomDecimals>下的<decimal>子节点的子节点,自然找不到内容。
  • DecimalElement类里的映射写了decimal <- map["decimal"],但<decimal>节点本身没有子节点,只有文本内容,这相当于在找当前节点下的<decimal>子节点,也是错误的。

修正方案(两种可选)

方案一:简化模型,直接用字符串数组

如果不需要单独的DecimalElement类,直接把randomDecimals定义为[String]类型,映射逻辑更简洁:

class Response: XMLMappable {
    var nodeName: String!
    var shouldReset: Bool!
    var randomDecimals: [String]?
    
    required init(map: XMLMap) { }
    
    func mapping(map: XMLMap) {
        // 直接映射RandomDecimals下所有decimal子节点的文本为字符串数组
        randomDecimals &lt;- map["RandomDecimals.decimal"]
        shouldReset &lt;- map["ShouldReset"]
    }
}

方案二:保留DecimalElement类,修正映射逻辑

如果必须保留DecimalElement类来封装每个decimal节点,需要调整两个地方:

  1. 修改DecimalElement的映射逻辑,获取节点的文本内容:
class DecimalElement: XMLMappable {
    var nodeName: String!
    var decimal: String? // 这里的属性名可以根据需求调整
    
    required init(map: XMLMap) { }
    
    func mapping(map: XMLMap) {
        // 映射当前<decimal>节点的文本内容
        decimal &lt;- map.innerText
    }
}
  1. 修改Response的映射路径,指向<RandomDecimals>节点,XMLMapper会自动把该节点下的所有<decimal>子节点解析成DecimalElement数组:
class Response: XMLMappable {
    var nodeName: String!
    var shouldReset: Bool!
    var randomDecimals: [DecimalElement]?
    
    required init(map: XMLMap) { }
    
    func mapping(map: XMLMap) {
        // 映射RandomDecimals节点下的所有decimal子节点为数组
        randomDecimals &lt;- map["RandomDecimals"]
        shouldReset &lt;- map["ShouldReset"]
    }
}

这样调整后,XMLMapper就能正确把所有<decimal>节点的内容存入randomDecimals数组了~

内容的提问来源于stack exchange,提问作者erdemgc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:01