Go语言用encoding/xml包解析XML需定义带xml标签的导出结构体,用xml.Unmarshal反序列化;支持元素映射、属性绑定、文本捕获、任意子元素接收及嵌套切片处理,并注意命名空间、大小写和空元素等细节。

Go语言用encoding/xml包解析XML非常直接,核心是通过结构体标签(xml:)控制字段与XML元素的映射关系,再用xml.Unmarshal完成反序列化。
定义结构体并设置XML标签
结构体字段需用xml标签声明对应XML节点名、属性或特殊行为。常见写法:
-
xml:"name":匹配同名XML元素(区分大小写) -
xml:"name,attr":绑定XML属性(如→ID string `xml:"id,attr"`) -
xml:",chardata":捕获文本内容(如→Hello Text string `xml:",chardata"`) -
xml:",any":接收未定义字段的任意子元素(需类型为[]byte或xml.Name等) -
xml:"-":忽略该字段
解析XML字符串或文件
用xml.Unmarshal将字节切片或io.Reader转为结构体:
data := `` var p Person err := xml.Unmarshal([]byte(data), &p) if err != nil { log.Fatal(err) } Alice 30
读文件时可传入*os.File或bytes.NewReader等满足io.Reader接口的对象。
立即学习“go语言免费学习笔记(深入)”;
处理嵌套与重复元素
XML中常见嵌套结构和多个同名子元素:
- 嵌套:结构体字段类型设为另一个结构体即可(如
Address Address `xml:"address"`) - 重复元素(如多个
):字段类型用切片(如Items []Item `xml:"item"`) - 混合内容(元素内含文本+子元素):用
xml:",any"配合xml.CharData或自定义解析逻辑
注意点和常见坑
解析时容易忽略的关键细节:
- 结构体字段必须首字母大写(即导出),否则
Unmarshal无法访问 - XML命名空间(如
xmlns:ns="http://example.com")需在标签中显式写全,如xml:"ns:name" - 空元素(如
)会正确映射为零值,无需额外判断 - 如果XML有DOCTYPE或注释,
Unmarshal默认跳过,不影响解析










