如何使用Golang encoding/xml解析XML数据_Golang XML编码与解析示例

22次阅读

go语言encoding/xml包支持类型安全的xml解析与序列化,通过Struct tag映射字段,支持属性(attr)、文本(chardata)、切片自动收集、命名空间及Marshal/Unmarshal操作。

如何使用Golang encoding/xml解析XML数据_Golang XML编码与解析示例

Go 语言的 encoding/xml 包提供了简洁、高效且类型安全的 XML 解析与序列化能力。它不依赖外部库,原生支持结构体标签映射,适合处理配置文件、API 响应(如 RSS、SOAP)、简单数据交换等场景。

定义结构体并使用 XML 标签

解析 XML 的核心是将 XML 元素与 Go 结构体字段通过 xml struct tag 映射。标签语法为 xml:"name,attr|chardata|omitempty|any",常用选项包括:

  • 字段名匹配元素名:默认使用字段名小写形式(如 Name<name></name>),也可显式指定:xml:"user_name"
  • 属性值用 attr:如 ID int `xml:"id,attr"` 对应 <user id="123"></user>
  • 文本内容用 chardata:如 Content String `xml:",chardata"` 捕获 <title>Hello</title> 中的 Hello
  • omitempty:序列化时忽略零值字段(不影响解析)
  • 嵌套结构体自动展开:无需额外 tag,子结构体对应子元素

解析 XML 字符串或文件

使用 xml.Unmarshal字节切片或 io.Reader 解析为结构体。注意错误检查不可省略:

data := []byte(`<user id="1001"><name>Alice</name><age>30</age></user>`) var u User err := xml.Unmarshal(data, &u) if err != nil {     log.Fatal(err) } // u.ID == 1001, u.Name == "Alice", u.Age == 30

从文件读取时可直接传入 *os.File 或其他 io.Reader(如 bytes.NewReader(data)http.Response.Body)。

立即学习go语言免费学习笔记(深入)”;

处理多层级、重复元素与命名空间

XML 中常见列表(如多个 <item></item>)可用切片接收:

如何使用Golang encoding/xml解析XML数据_Golang XML编码与解析示例

慧中标AI标书

慧中标AI标书是一款AI智能辅助写标书工具。

如何使用Golang encoding/xml解析XML数据_Golang XML编码与解析示例 295

查看详情 如何使用Golang encoding/xml解析XML数据_Golang XML编码与解析示例

type Feed struct {     XMLName xml.Name `xml:"rss"`     Channel   Channel  `xml:"channel"` } type Channel struct {     Title string `xml:"title"`     Items []Item `xml:"item"` // 自动收集所有 <item> 节点 } type Item struct {     Title   string `xml:"title"`     Link    string `xml:"link"`     PubDate string `xml:"pubDate"` }

命名空间(如 xmlns:dc="http://purl.org/dc/elements/1.1/")需在 tag 中完整写出前缀,例如:Creator string `xml:"dc:creator"`。若不确定命名空间,可用 xml:",any" 捕获未知子元素(慎用,会丢失结构)。

生成 XML(编码)也很简单

xml.Marshalxml.MarshalIndent(带缩进)将结构体转为 XML 字节流:

u := User{ID: 999, Name: "Bob", Age: 25} output, err := xml.MarshalIndent(u, "", "  ") if err != nil {     log.Fatal(err) } fmt.Println(string(output)) // 输出: // <user id="999"> //   <name>Bob</name> //   <age>25</age> // </user>

注意:根结构体字段若未设置 xml:"name",默认以结构体名小写作为根元素名;若想自定义根名,可嵌套一层或使用匿名字段 + 显式 tag。

基本上就这些。golang 的 XML 支持不复杂但容易忽略 tag 细节,尤其 attrchardata 的位置、切片自动收集机制,以及命名空间写法。实际用时建议先打印原始 XML,再对照结构体标签逐步调试。

text=ZqhQzanResources