Go语言解析XML主要依靠encoding/xml标准库,通过结构体标签映射XML节点与属性,用xml.Unmarshal反序列化、xml.Marshal生成XML,需注意字段导出、标签匹配、错误处理及命名空间支持。

Go语言解析XML主要靠标准库encoding/xml,核心是用结构体标签映射XML元素,再通过xml.Unmarshal反序列化,或xml.Marshal生成XML。关键在结构体定义是否准确、标签是否匹配。
结构体定义与XML标签映射
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:",omitempty":序列化时忽略零值字段
解析XML字符串或文件
用xml.Unmarshal将字节切片或io.Reader转为结构体:
- 解析字符串:
xml.Unmarshal([]byte(xmlStr), &v) - 解析文件:
xml.NewDecoder(file).Decode(&v)(支持流式读取大文件) - 注意错误检查:返回非
nil错误时需处理,常见如标签不匹配、嵌套错位、编码问题(确保UTF-8)
处理嵌套、重复和动态结构
复杂XML需组合结构体嵌套、切片和指针:
立即学习“go语言免费学习笔记(深入)”;
- 重复元素(如多个
)→ 字段类型为[]Item - 可选元素 → 字段用指针(如
*string)或xml:",omitempty" - 未知子节点 → 用
map[string]interface{}配合xml:",any",但需手动解析内部 - 命名空间(如
xmlns:ns="http://example.com")→ 标签中加前缀,如xml:"ns:name",并确保解析器识别该命名空间
生成XML输出
用xml.Marshal或xml.MarshalIndent(带缩进)将结构体转XML:
- 导出字段才参与序列化(首字母大写)
- 空字段默认输出为空标签(
),加omitempty可跳过 - 若需自定义根元素名,可包装一层结构体并设
xml:"root" - 生成后建议用
xmlfmt等工具验证格式合法性










