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 <- map["RandomDecimals.decimal"] shouldReset <- map["ShouldReset"] } }
方案二:保留DecimalElement类,修正映射逻辑
如果必须保留DecimalElement类来封装每个decimal节点,需要调整两个地方:
- 修改
DecimalElement的映射逻辑,获取节点的文本内容:
class DecimalElement: XMLMappable { var nodeName: String! var decimal: String? // 这里的属性名可以根据需求调整 required init(map: XMLMap) { } func mapping(map: XMLMap) { // 映射当前<decimal>节点的文本内容 decimal <- map.innerText } }
- 修改
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 <- map["RandomDecimals"] shouldReset <- map["ShouldReset"] } }
这样调整后,XMLMapper就能正确把所有<decimal>节点的内容存入randomDecimals数组了~
内容的提问来源于stack exchange,提问作者erdemgc
相关产品推荐
相关产品推荐

