Go语言通过encoding/xml包提供XML解析与序列化能力,核心是结构体标签映射、xml.Unmarshal/xml.Marshal双向转换及xml.Token流式解析。

Go语言通过encoding/xml包提供了简洁、高效的XML解析与序列化能力,无需第三方库即可完成结构化XML的读写。核心在于用结构体标签(xml:)精准映射XML元素和属性,再配合xml.Unmarshal或xml.Marshal完成双向转换。
定义结构体并设置XML标签
结构体字段需通过xml标签声明其在XML中的对应关系。常用标签值包括:
-
xml:"name":匹配XML元素名(如→xml:"title") -
xml:",attr":表示该字段为当前元素的XML属性(如id="123"→ID string `xml:"id,attr"`) -
xml:",chardata":捕获元素的纯文本内容(如→Hello Text string `xml:",chardata"`) -
xml:",any":接收未定义字段的任意子元素(慎用,适合松散结构) -
xml:",omitempty":序列化时若字段为空则忽略该元素
解析XML字符串或文件
使用xml.Unmarshal将XML数据解码为Go结构体:
- 从字符串解析:
err := xml.Unmarshal([]byte(xmlStr), &v) - 从文件解析:
data, _ := os.ReadFile("data.xml"); xml.Unmarshal(data, &v) - 支持嵌套结构体,自动按层级匹配;若XML有命名空间,需在标签中显式写明(如
xml:"rss channel:item") - 解析失败时返回具体错误(如字段类型不匹配、标签名不一致),建议检查结构体字段导出性(首字母大写)和标签拼写
生成XML输出
用xml.Marshal将结构体转为XML字节流,可直接打印或写入文件:
立即学习“go语言免费学习笔记(深入)”;
-
output, err := xml.MarshalIndent(v, "", " ")支持缩进美化输出 - 若结构体含
XMLName xml.Name `xml:"root"`字段,可自定义根元素名 - 注意:切片字段会自动展开为多个同名元素(如
[]Item→ 多个) - 空字符串、零值字段默认仍会输出,加
omitempty可跳过
处理动态或未知结构
对格式多变或无法预定义结构的XML,可用xml.Token进行流式解析:
- 创建
xml.Decoder,循环调用Token()逐个读取开始标签、字符数据、结束标签等 - 适合解析大型XML(内存友好)、提取特定片段、或构建通用XML处理器
- 需手动维护状态(如当前路径、是否在目标节点内),逻辑比结构体映射复杂,但灵活性更高
基本上就这些。掌握结构体标签规则和Unmarshal/Marshal的典型用法,就能覆盖大多数XML处理场景。流式解析作为补充手段,在特殊需求下再启用。










