如何用Go语言将结构体编码为XML

1次阅读

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

如何用Go语言将结构体编码为XML

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无法访问。

text=ZqhQzanResources