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

Go语言解析含CDATA的XML时结构体为空问题求助

解决Go中xml.Unmarshal解析XML后结构体为空的问题

嘿,我来帮你排查这个问题!你遇到的情况其实是Go XML解析里的常见小坑,主要有两个关键点需要修正:

1. 必须传递结构体指针给xml.Unmarshal

xml.Unmarshal函数需要通过指针来修改你传入的结构体实例——如果你直接传result(值类型),函数只会修改一个临时副本,原结构体自然还是空的。这是导致你结构体为空的核心原因!

2. 额外注意:XML的CDATA与字符串定义细节

你的<ok>标签里用了CDATA,不过Go的encoding/xml包会自动把CDATA内容当作普通文本解析,所以只要标签映射正确就没问题。另外你原来的bodyXML用了单引号',Go里字节切片的字符串字面量应该用反引号`或者双引号,不然会编译报错。

修正后的完整可运行代码

package main

import (
	"encoding/xml"
	"fmt"
)

func main() {
	// 用反引号包裹XML内容,避免换行和特殊字符的转义问题
	var bodyXML = []byte(`<?xml version="1.0" encoding="ISO-8859-1"?> 
<smsBatchResponse> 
    <ok> 
        <![CDATA[CHECK_OK]]> 
    </ok> 
</smsBatchResponse>`)

	type SmsBatchResponse struct {
		Ok string `xml:"ok"` // 标签映射没问题,CDATA会被自动解析为文本
	}

	var result SmsBatchResponse
	// 这里一定要传指针 &result
	err := xml.Unmarshal(bodyXML, &result)
	// 千万不要忽略错误!加上错误处理能快速定位问题
	if err != nil {
		fmt.Printf("XML解析失败: %v\n", err)
		return
	}
	fmt.Println(result) // 现在会正确输出 {CHECK_OK}
}

补充提示

  • 永远不要忽略xml.Unmarshal的返回错误!你原来的代码没有接收错误,万一XML格式有问题或者标签映射错误,你根本无法察觉。
  • 如果后续需要明确处理CDATA,可以把结构体标签改成xml:"ok,omitempty,cdata",不过对于你的场景,默认的解析方式已经足够。

这样修改后,你的结构体就能正确获取到XML里的内容啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:01