Go语言怎么把结构体编码成XML MarshalIndent格式化输出

Go语言中用xml.MarshalIndent可生成格式化XML字符串,需确保结构体字段首字母大写、添加xml标签(如xml:"name"或xml:",omitempty"),并传入结构体指针、空前缀和缩进符(如" "),错误需检查,XML声明需手动拼接xml.Header。

Go语言中用 xml.MarshalIndent 可以把结构体转成格式化(带缩进)的XML字符串,关键是要确保结构体字段可导出、有合适的XML标签,并正确调用函数。

结构体定义要规范

字段名必须大写(可导出),推荐加上 xml struct tag 明确字段名、是否省略空值、是否作为属性等:

  • 字段名首字母大写,否则 xml 包无法访问
  • xml:"name" 指定XML元素名;xml:"name,attr" 表示作为属性;xml:",omitempty" 表示零值时忽略该字段
  • 根元素建议用匿名字段或显式命名,避免生成多余包裹层

例如:

type Person struct {
  XMLName xml.Name `xml:"person"`
  Name string `xml:"name"`
  Age int `xml:"age"`
  Email string `xml:"email,omitempty"`
}

调用 MarshalIndent 生成缩进XML

传入结构体指针、前缀(通常为空)、缩进符(如两个空格或 "\t"):

  • 必须传指针:&person,不然会静默失败(返回空字节)
  • 前缀一般设为空字符串 "";缩进符常用 " "(两个空格)或 "\t"
  • 返回 []byte 和 error,记得检查错误

示例代码:

person := Person{
  Name: "张三",
  Age: 28,
}

data, err := xml.MarshalIndent(&person, "", " ")
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(data))

输出效果示例

上面例子会输出类似:


  张三
  28

小技巧:加XML声明头

xml.MarshalIndent 不自动加 ,如需声明,手动拼接即可:

  • xml.Header + string(data)
  • xml.Header 是常量:"\n"

基本上就这些。不复杂但容易忽略指针和字段导出规则。