Go语言通过encoding/xml包支持XML解析与生成,使用结构体标签映射XML元素和属性。1. 定义结构体时用xml:"name"匹配元素名,xml:"attr,attr"处理属性;2. 用xml.Unmarshal解析XML数据到结构体;3. 用xml.MarshalIndent将结构体序列化为格式化XML,并添加xml.Header输出标准XML声明。嵌套元素通过嵌套结构体处理,支持复杂结构映射。

Go 语言标准库中的 encoding/xml 包提供了对 XML 数据的解析和序列化支持,使用结构体标签(struct tags)可以方便地将 XML 文件映射到 Go 结构中,也可以将结构体数据编码为 XML。下面介绍如何使用它来解析和生成 XML 文件。
定义结构体映射 XML 元素
要解析 XML,首先要根据 XML 的结构定义对应的 Go 结构体。通过在结构体字段上使用 xml 标签,指定字段与 XML 元素或属性的对应关系。
例如,有如下 XML 内容:
可以定义如下结构体:
立即学习“go语言免费学习笔记(深入)”;
type Person struct {XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
City string `xml:"city"`
}
XMLName 字段用于匹配根元素名称,不是必须的,但有助于明确映射关系。
解析 XML 文件
使用 xml.Unmarshal 函数可以将 XML 数据解析到结构体中。
示例代码:
data := `log.Fatal(err)
} fmt.Printf("%+v\n", person)
输出:
{XMLName:{Space: Local:person} Name:Alice Age:30 City:Beijing}如果 XML 存在于文件中,可以先读取文件内容:
file, err := os.Open("person.xml")if err != nil {
log.Fatal(err)
}
defer file.Close() data, _ := io.ReadAll(file)
var person Person
xml.Unmarshal(data, &person)
处理属性和嵌套结构
XML 常包含属性(attributes),可用 attr 标签标识。
例如:
结构体可定义为:
type Person struct {XMLName xml.Name `xml:"person"`
ID string `xml:"id,attr"`
Type string `xml:"type,attr"`
Name string `xml:"name"`
}
对于嵌套元素,结构体也可嵌套:
对应结构体:
type Address struct {City string `xml:"city"`
Zip string `xml:"zip"`
} type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Address Address `xml:"address"`
}
XML 序列化(生成 XML)
使用 xml.Marshal 或 xml.MarshalIndent 可将结构体转换为 XML 数据。
person := Person{Name: "David",
Age: 25,
City: "Guangzhou",
} output, err := xml.MarshalIndent(person, "", " ")
if err != nil {
log.Fatal(err)
} fmt.Println(xml.Header + string(output))
xml.Header 是可选的 XML 声明(如 ),建议添加以保证格式正确。
输出示例:










