如何在Golang中使用encoding/xml处理XML

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何在Golang中使用encoding/xml处理XML》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Golang中使用encoding/xml处理XML》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在Golang中使用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.Marshalxml.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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。