go语言通过encoding/xml包支持结构体xml序列化,需用xml标签显式声明字段映射规则,调用xml.marshal或xml.encoder完成编码,导出字段为必要前提。

Go语言通过标准库encoding/xml包原生支持结构体到XML的序列化,关键在于正确设置结构体字段标签(xml tag)并调用xml.Marshal。
定义带XML标签的结构体
Go不会自动将字段名转为XML元素名,必须显式用xml:标签声明。常用写法:
-
xml:"name":指定元素名(如xml:"user"→<user></user>) -
xml:",attr":作为当前元素的属性(如ID int `xml:"id,attr"`→<user id="123"></user>) -
xml:",chardata":将字段值作为文本内容(适用于混合内容或纯文本节点) -
xml:",omitempty":字段为空值(零值)时忽略该元素 -
xml:"-":完全忽略该字段
示例:
type User struct { XMLName xml.Name `xml:"user"` ID int `xml:"id,attr"` Name string `xml:"name"` Email string `xml:"contact>email"` // 嵌套路径 Active bool `xml:"active,omitempty"` Notes string `xml:",chardata"` }
调用xml.Marshal进行编码
传入结构体实例,返回[]byte和错误。无需手动创建文档头,但可自行拼接。
立即学习“go语言免费学习笔记(深入)”;
u := User{ ID: 101, Name: "Alice", Email: "alice@example.com", Active: true, Notes: "VIP user", } data, err := xml.Marshal(u) if err != nil { log.Fatal(err) } // 可选:添加XML声明 output := []byte(xml.Header + string(data)) fmt.Println(string(output))
输出效果:
<?xml version="1.0" encoding="UTF-8"?> <user id="101"> <name>Alice</name> <contact><email>alice@example.com</email></contact> <active>true</active> VIP user </user>
处理嵌套结构与切片
嵌套结构体会自动展开为子元素;切片会生成多个同名元素。
type Order struct { XMLName xml.Name `xml:"order"` ID string `xml:"id,attr"` Items []Item `xml:"item"` } type Item struct { Name string `xml:"name"` Price float64 `xml:"price"` } order := Order{ ID: "ORD-001", Items: []Item{ {Name: "Book", Price: 29.99}, {Name: "Pen", Price: 3.50}, }, }
结果中<item></item>会重复两次,分别对应切片中的每个元素。
写入文件或http响应
直接使用xml.Encoder可避免内存拷贝,适合大数据量:
file, _ := os.Create("user.xml") defer file.Close() encoder := xml.NewEncoder(file) encoder.Indent("", " ") // 美化缩进 err := encoder.Encode(u) if err != nil { log.Fatal(err) }
对HTTP服务,可直接写入http.ResponseWriter(注意设Content-Type):
w.Header().Set("Content-Type", "application/xml") encoder := xml.NewEncoder(w) encoder.Encode(u)
不复杂但容易忽略:字段必须是导出的(首字母大写),否则xml.Marshal无法访问。