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