Go (Golang) 中的 XML 处理:encoding/xml 包及替代方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go 语言中 XML 处理简介



Go 语言(Golang)通过标准包 encoding/xml 提供了一种强大且优雅的方式来处理 XML。该包实现了一个简单的接口,用于读取(解析)和写入(序列化)XML 文档,并利用结构体标签(struct tags)。与许多其他语言不同,Go 不需要创建单独的 DOM 或 SAX 解析器——只需描述数据结构,该包就会自动将 XML 标签与字段匹配。



在本文中,我们将详细探讨 encoding/xml 包的主要功能,从基本解析开始,一直到高级技术:属性处理、命名空间、大型文件的流式读取以及 XML 生成。我们还将介绍在特定场景下可能有用的流行第三方库。



基础:将 XML 解析为 Go 结构体



在 Go 中处理 XML 最常见的方式是将 XML 数据反序列化(unmarshal)为结构体实例。这通过 xml.Unmarshal() 函数实现。关键特性是在结构体字段声明中使用 xml:"..." 标签。



简单示例:解析 RSS 源



package main

import ( "encoding/xml" "fmt")

// RSS 元素的结构体type RSS struct { XMLName xml.Name `xml:"rss"` Channel Channel `xml:"channel"`}

type Channel struct { Title string `xml:"title"` Description string `xml:"description"` Items []Item `xml:"item"`}

type Item struct { Title string `xml:"title"` Link string `xml:"link"` Description string `xml:"description"`}

func main() { data := `<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Example Feed</title> <description>A sample RSS feed</description> <item> <title>First Post</title> <link>https://example.com/1</link> <description>This is the first post.</description> </item> </channel> </rss>`

var rss RSS err := xml.Unmarshal([]byte(data), &rss) if err != nil { panic(err) }

fmt.Printf("频道: %s", rss.Channel.Title) fmt.Printf("描述: %s", rss.Channel.Description) for _, item := range rss.Channel.Items { fmt.Printf("- %s (%s)", item.Title, item.Link) }}


在这个示例中,标签 xml:"rss" 将结构体与根元素关联,而 xml:"channel"、xml:"item" 则与嵌套元素关联。XMLName 字段是可选的,但允许获取根元素的名称。



处理 XML 属性



XML 属性通过标签中的特殊语法处理:xml:"标签名,attr"。如果属性直接位于根元素中,则使用 xml:",attr"。



type Person struct {    XMLName xml.Name `xml:"person"`    ID      int      `xml:"id,attr"`    Name    string   `xml:"name"`    Age     int      `xml:"age,attr"`}

func main() { xmlData := `<person id="123" age="30"><name>Alice</name></person>` var p Person xml.Unmarshal([]byte(xmlData), &p) fmt.Printf("ID: %d, Name: %s, Age: %d", p.ID, p.Name, p.Age) // 输出: ID: 123, Name: Alice, Age: 30}


生成(序列化)XML



要从结构体创建 XML,使用 xml.Marshal() 函数,或使用 xml.MarshalIndent() 进行格式化输出。该包会自动使用结构体标签来生成正确的元素名称和属性。



type Book struct {    XMLName xml.Name `xml:"book"`    Title   string                    

推荐