Go语言使用encoding/xml解析XML无法填充结构体是什么原因?
问题原因
- 核心问题是结构体定义的XML标签映射规则和实际XML结构不匹配:
- 你要解析的XML根节点就是
<RESULTS>,解码时会直接把根节点对应到你传入的Results结构体实例 - 根节点
<RESULTS>下的直接子节点是多个<NAME>,但你原本给Results.Names字段加的标签是xml:"RESULTS",相当于告诉解析器去根节点下找名为<RESULTS>的子节点,再把它下面的内容解析为[]Name类型,实际XML里没有这层嵌套结构,所以解析结果为空。
- 你要解析的XML根节点就是
修复方案
只需要修改Results结构体的字段标签,将Names字段的XML映射目标改为NAME即可:
type Results struct { Names []Name `xml:"NAME"` // 将原来的RESULTS改为NAME }
修复后完整可运行代码
package main import "fmt" import "encoding/xml" import "bytes" type Name struct { Name string `xml:"NAME"` } type Results struct { Names []Name `xml:"NAME"` } func main() { data := []byte(` <?xml version="1.0" encoding="UTF-8"?> <RESULTS> <NAME>Apple</NAME> <NAME>Banana</NAME> </RESULTS> `) var r Results decoder := xml.NewDecoder(bytes.NewBuffer(data)) unError := decoder.Decode(&r) if unError != nil { fmt.Println("XML Unmarshaling error:", unError ) }else{ fmt.Printf("%v", r) } }
运行后输出为:{[{Apple} {Banana}]},符合预期。
内容的提问来源于stack exchange,提问作者ymudyruc
相关产品推荐
相关产品推荐

