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
相关产品推荐
相关产品推荐

