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))
输出效果:
程序采用ASP+ACCESS开发完成。中英繁三语言,所有页面采用UTF-8全球通用编码,兼容简体中文、繁体中文及英语,适用于中小企业网站运用。后台数据同时录入中文及英文,繁体采用JS自动转换,无需维护。免费版主要功能如下:·系统管理:系统综合设置、管理员管理、数据库备份、上传文件管理。·单页管理:自由无限制添加个性页面,如:公司简介、组织结构、联系我们等
<?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无法访问。









