在Golang开发中,XML作为一种通用的数据交换格式,经常出现在接口对接、配置文件读取等场景中,标准库encoding/xml提供了完整的XML处理能力,下面我们就来详细介绍它的具体用法。

核心概念:结构体与XML标签映射
使用encoding/xml处理XML的核心是定义和XML结构对应的结构体,通过结构体标签指定节点名称、属性等映射关系,常用的标签规则如下:
xml:"节点名":指定结构体字段对应XML的节点名称xml:"节点名,attr":指定结构体字段对应XML节点的属性xml:"节点名>子节点名":指定结构体字段对应XML的嵌套子节点xml:",chardata":指定结构体字段对应XML节点的文本内容xml:",innerxml":保留对应XML节点的原始内容,不做解析
XML解析操作
解析XML字符串
我们可以使用xml.Unmarshal方法将XML字符串解析到对应的结构体中,下面是完整的示例代码:
package main
import (
"encoding/xml"
"fmt"
)
// 定义和XML结构对应的结构体
type User struct {
XMLName xml.Name `xml:"user"` // 指定根节点名称为user
ID int `xml:"id,attr"` // id是user节点的属性
Name string `xml:"name"` // name是user的子节点
Age int `xml:"age"` // age是user的子节点
Email string `xml:"contact>email"` // email是contact节点的子节点
}
func main() {
// 待解析的XML字符串
xmlStr := `<user id="1001">
<name>张三</name>
<age>25</age>
<contact>
<email>test@ipipp.com</email>
</contact>
</user>`
var user User
// 解析XML字符串
err := xml.Unmarshal([]byte(xmlStr), &user)
if err != nil {
fmt.Println("解析XML失败:", err)
return
}
// 输出解析结果
fmt.Printf("用户ID: %d\n", user.ID)
fmt.Printf("用户姓名: %s\n", user.Name)
fmt.Printf("用户年龄: %d\n", user.Age)
fmt.Printf("用户邮箱: %s\n", user.Email)
}解析XML文件
如果需要解析本地XML文件,只需要先读取文件内容,再调用xml.Unmarshal即可,示例代码如下:
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Config struct {
XMLName xml.Name `xml:"config"`
Port int `xml:"port"`
DbHost string `xml:"db>host"`
DbPort int `xml:"db>port"`
}
func main() {
// 读取XML文件内容
data, err := os.ReadFile("config.xml")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
var config Config
// 解析文件内容
err = xml.Unmarshal(data, &config)
if err != nil {
fmt.Println("解析XML失败:", err)
return
}
fmt.Printf("服务端口: %d\n", config.Port)
fmt.Printf("数据库地址: %s:%d\n", config.DbHost, config.DbPort)
}XML生成操作
使用xml.Marshal或xml.MarshalIndent可以将结构体数据生成XML格式的内容,xml.MarshalIndent可以生成带缩进的格式化XML,更易阅读,示例代码如下:
package main
import (
"encoding/xml"
"fmt"
)
type Book struct {
XMLName xml.Name `xml:"book"`
ISBN string `xml:"isbn,attr"`
Title string `xml:"title"`
Author string `xml:"author"`
Price float64 `xml:"price"`
}
func main() {
// 初始化结构体数据
book := Book{
ISBN: "9787111111111",
Title: "Golang编程入门",
Author: "李四",
Price: 59.9,
}
// 生成带缩进的XML内容
data, err := xml.MarshalIndent(book, "", " ")
if err != nil {
fmt.Println("生成XML失败:", err)
return
}
// 添加XML头声明
xmlHeader := []byte(xml.Header)
// 拼接最终结果
result := append(xmlHeader, data...)
fmt.Println(string(result))
}注意事项
- 结构体字段必须是大写开头的可导出字段,否则
encoding/xml无法访问到字段值 - 如果XML节点名称和结构体字段名一致,可以省略标签中的节点名,只写其他属性,比如
xml:",attr" - 解析XML时如果节点不存在,对应的结构体字段会被赋为零值,不会报错
- 生成XML时如果需要自定义XML头声明,可以手动拼接,默认
xml.Marshal不会添加头声明
实际开发中如果遇到复杂的XML结构,可以先通过在线XML转结构体工具生成基础结构体,再根据实际情况调整标签配置,能大幅提升开发效率。
Golangencoding/xmlXML解析XML生成struct标签修改时间:2026-06-02 16:23:28