Go语言使用encoding/xml包实现结构体XML序列化,核心函数为xml.Marshal和xml.MarshalIndent,支持标签控制、嵌套、命名空间等特性。

如果您希望将 Go 语言中的结构体序列化为符合 XML 格式的字符串或写入文件,则需使用标准库中的 encoding/xml 包。该包提供了一组用于 XML 编码与解码的类型和函数,核心是 xml.Marshal 和 xml.MarshalIndent。以下是实现结构体到 XML 编码的多种方式:
一、基础结构体 XML 编码(无格式)
此方法使用 xml.Marshal 将结构体直接转为紧凑的 XML 字节切片,适用于对可读性无要求的场景,如网络传输或内部存储。
1、定义结构体,并为字段添加 xml 标签以控制元素名称、是否省略空值、是否作为属性等。
2、调用 xml.Marshal 函数传入结构体实例,返回 []byte 和错误。
立即学习“go语言免费学习笔记(深入)”;
3、将结果转换为字符串并打印,确认输出是否符合预期 XML 结构。
二、带缩进的 XML 编码(提升可读性)
当需要生成人类可读的 XML(如调试、配置导出),应使用 xml.MarshalIndent,它支持指定前缀和缩进符,使嵌套层级清晰可见。
1、准备待编码的结构体变量,确保其字段标签已正确设置。
2、调用 xml.MarshalIndent(v, "", " "),其中第二个参数为前缀(通常为空字符串),第三个参数为每级缩进使用的字符串(例如两个空格)。
3、检查返回的字节切片,确认根元素外层无多余换行或空格,且子元素按层级缩进排列。
三、控制字段是否参与编码(omitempty 与 - 标签)
通过结构体字段的 XML 标签可精细控制序列化行为:omitempty 表示零值字段不输出;- 表示该字段完全忽略,不生成任何 XML 内容。
1、在结构体字段后添加 `xml:"field_name,omitempty"`,例如 Age int `xml:"age,omitempty"`。
2、对不希望出现在 XML 中的字段,使用 `xml:"-"`,如 Secret string `xml:"-"`。
3、构造一个包含零值字段和敏感字段的实例,执行 Marshal 后验证输出中是否缺失对应元素。
四、嵌套结构体与切片的 XML 编码
XML 常需表达层级关系和重复元素,Go 中可通过嵌套结构体和切片字段实现,encoding/xml 自动将其映射为嵌套元素或同名元素列表。
1、定义外层结构体,其中包含另一个结构体类型的字段或 []InnerStruct 类型字段。
2、为切片字段指定 XML 标签,如 Items []Item `xml:"item"`,使每个切片项生成一个
3、为嵌套结构体字段指定标签,如 Author AuthorInfo `xml:"author"`,确保其内容嵌入为子元素而非扁平展开。
五、自定义 XML 根元素名称与命名空间
默认情况下,Marshal 使用结构体类型名作为根元素名;若需覆盖,可在结构体上使用 xml.Name 字段或顶层标签指定;命名空间则通过 XML 标签中的 xmlns 属性实现。
1、在结构体首字段声明 XMLName xml.Name `xml:"bookstore"`,强制根元素名为
2、在字段标签中加入命名空间前缀和 URI,如 Title string `xml:"dc:title" xmlns:dc="http://purl.org/dc/elements/1.1/"`。
3、调用 xml.Marshal 后,检查输出 XML 是否包含正确的根名及 xmlns:dc 声明,且子元素使用对应前缀。










