0Pricing
Go Academy · 课时

encoding/xml

处理 XML

encoding/xml 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

处理 XML

XML 是一种冗长的、基于标签的格式,在旧系统和配置文件中仍然很常见。Go 的 encoding/xml 包可以对其进行序列化和反序列化,使用方式与 json 包相似。

序列化为 XML

xml.Marshal 会将 Go 值转换为 XML 字节。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	Name string
	Age  int
}

func main() {
	b, _ := xml.Marshal(User{"Ann", 30})
	fmt.Println(string(b))
}

XML 标签

xml 标签控制元素名称,就像 json 标签控制 JSON 键一样。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	Name string "xml:\"name\""
}

func main() {
	b, _ := xml.Marshal(User{"Ann"})
	fmt.Println(string(b))
}

使用 XMLName 设置根元素

一个名为 XMLName 且类型为 xml.Name 的字段,可以设置根元素的名称。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	XMLName xml.Name "xml:\"user\""
	Name    string   "xml:\"name\""
}

func main() {
	b, _ := xml.Marshal(User{Name: "Ann"})
	fmt.Println(string(b))
}

属性

在标签中添加 ,attr,即可将字段呈现为 XML 属性,而不是子元素。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	XMLName xml.Name "xml:\"user\""
	ID      int      "xml:\"id,attr\""
	Name    string   "xml:\"name\""
}

func main() {
	b, _ := xml.Marshal(User{ID: 7, Name: "Ann"})
	fmt.Println(string(b))
}

反序列化 XML

xml.Unmarshal 会将 XML 字节解析到指针指向的值中,并根据标签匹配元素名称。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	Name string "xml:\"name\""
}

func main() {
	var u User
	xml.Unmarshal([]byte("<User><name>Bob</name></User>"), &u)
	fmt.Println(u.Name)
}

嵌套元素

嵌套结构体会映射为嵌套的 XML 元素,从而构建出一棵树。

package main

import (
	"encoding/xml"
	"fmt"
)

type Address struct {
	City string "xml:\"city\""
}
type User struct {
	Name    string  "xml:\"name\""
	Address Address "xml:\"address\""
}

func main() {
	b, _ := xml.Marshal(User{"Ann", Address{"Rome"}})
	fmt.Println(string(b))
}

格式化 XML

xml.MarshalIndent 会为输出添加缩进,使其更易阅读。

package main

import (
	"encoding/xml"
	"fmt"
)

type User struct {
	Name string "xml:\"name\""
}

func main() {
	b, _ := xml.MarshalIndent(User{"Ann"}, "", "  ")
	fmt.Println(string(b))
}

重复元素

切片字段会变成一系列重复的 XML 元素,每个元素对应一个项目。

package main

import (
	"encoding/xml"
	"fmt"
)

type List struct {
	Items []string "xml:\"item\""
}

func main() {
	b, _ := xml.Marshal(List{Items: []string{"a", "b"}})
	fmt.Println(string(b))
}

JSON 与 XML

两者的 API 彼此对应:Marshal、Unmarshal、MarshalIndent 以及结构体标签。XML 还增加了属性和 XMLName 根元素概念。新建 API 时优先使用 JSON;旧系统则使用 XML。

头部声明

常量 xml.Header 保存着标准 XML 声明字符串。您可以将它添加到输出的开头,以生成完整的文档。

package main

import (
	"encoding/xml"
	"fmt"
)

func main() {
	fmt.Print(xml.Header)
}

快速检查

,attr 选项在 xml 结构体标签中有什么作用?

回顾

encoding/xml:

  • xml.Marshal / Unmarshal 与 json API 相对应
  • xml 标签用于命名元素;,attr 会创建属性
  • XMLName 设置根元素;切片会生成重复元素

常见问题解答

「encoding/xml」课时是免费的吗?

是的 — 「encoding/xml」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「encoding/xml」这节课中我会学到什么?

处理 XML 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「encoding/xml」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. encoding/json 回顾
  2. encoding/xml
  3. encoding/csv
  4. gob 与二进制编码
← 返回 Go Academy