Go语言通过encoding/xml包支持XML解析与生成,使用结构体标签映射元素和属性。1. 解析XML:定义结构体并绑定xml标签,如Person{Name, Age, City}对应name、age、city元素;2. 处理属性与嵌套:用xml:",attr"标识属性字段,XMLName指定根元素;3. 生成XML:通过xml.MarshalIndent序列化结构体并输出带格式的XML;4. 处理复杂结构:使用切片接收多个同名子元素,如Library包含[]Book。字段需导出(大写开头),推荐结构体方式处理常规场景。

Go语言通过标准库 encoding/xml 提供了对XML数据的解析和生成支持。无论是处理配置文件、Web服务接口(如SOAP),还是与其他系统交互,Go都能以结构体标签的方式简洁高效地操作XML。下面详细介绍其核心用法。
1. 解析XML:使用结构体绑定
Go推荐使用结构体(struct)来映射XML数据。通过在结构体字段上添加xml标签,可以指定字段与XML元素或属性的对应关系。
示例XML:
Alice 30 Beijing
对应的Go结构体定义:
立即学习“go语言免费学习笔记(深入)”;
type Person struct {
Name string `xml:"name"`
Age int `xml:"age"`
City string `xml:"city"`
}
解析代码:
xmlData := `` var p Person err := xml.Unmarshal([]byte(xmlData), &p) if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", p) // {Name:Alice Age:30 City:Beijing} Alice 30 Beijing
2. 处理XML属性和嵌套结构
XML中常使用属性(attribute)存储元信息。Go通过attr标签标识属性字段。
示例带属性的XML:
Go Programming John Doe
结构体定义:
type Book struct {
XMLName xml.Name `xml:"book"`
ID string `xml:"id,attr"`
Category string `xml:"category,attr"`
Title string `xml:"title"`
Author string `xml:"author"`
}
说明:
- XMLName:可选,用于匹配根元素名称
- attr:表示该字段对应XML属性而非子元素
3. 生成XML:序列化结构体
使用xml.Marshal或xml.MarshalIndent可将结构体转换为XML字符串。
b := Book{
ID: "456",
Category: "web",
Title: "Web Dev with Go",
Author: "Jane Smith",
}
output, err := xml.MarshalIndent(b, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(xml.Header + string(output))
输出结果会包含标准XML头和格式化内容:
Web Dev with Go Jane Smith
4. 处理复杂结构:切片与嵌套元素
当XML包含多个同名子元素时,可用切片接收。
示例:
Go Intro Advanced Go
结构体定义:
type Library struct {
Books []Book `xml:"book"`
}
解析后,Books切片会自动填充两个Book实例。
基本上就这些。encoding/xml包设计直观,结合结构体标签能应对大多数XML场景。注意字段必须是导出的(大写开头),否则无法被解析或序列化。对于不规则XML,也可使用xml.Decoder进行流式逐节点处理,但多数情况结构体方式更清晰高效。










