Go语言如何处理xml数据? Go标准库encoding/xml包用法详解

Go语言通过encoding/xml包支持XML解析与生成,使用结构体标签映射元素和属性。1. 解析XML:定义结构体并绑定xml标签,如Person{Name, Age, City}对应name、age、city元素;2. 处理属性与嵌套:用xml:",attr"标识属性字段,XMLName指定根元素;3. 生成XML:通过xml.MarshalIndent序列化结构体并输出带格式的XML;4. 处理复杂结构:使用切片接收多个同名子元素,如Library包含[]Book。字段需导出(大写开头),推荐结构体方式处理常规场景。

Go语言通过标准库 encoding/xml 提供了对XML数据的解析和生成支持。无论是处理配置文件、Web服务接口(如SOAP),还是与其他系统交互,Go都能以结构体标签的方式简洁高效地操作XML。下面详细介绍其核心用法。

1. 解析XML:使用结构体绑定

Go推荐使用结构体(struct)来映射XML数据。通过在结构体字段上添加xml标签,可以指定字段与XML元素或属性的对应关系。

示例XML:


  Alice
  30
  Beijing

对应的Go结构体定义:

type Person struct {
    Name string `xml:"name"`
    Age  int    `xml:"age"`
    City string `xml:"city"`
}

解析代码:

xmlData := `Alice30Beijing`
var p Person
err := xml.Unmarshal([]byte(xmlData), &p)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", p) // {Name:Alice Age:30 City:Beijing}

2. 处理XML属性和嵌套结构

XML中常使用属性(attribute)存储元信息。Go通过attr标签标识属性字段。

示例带属性的XML:


  Go Programming
  John Doe

结构体定义:

type Book struct {
    XMLName   xml.Name `xml:"book"`
    ID        string   `xml:"id,attr"`
    Category  string   `xml:"category,attr"`
    Title     string   `xml:"title"`
    Author    string   `xml:"author"`
}

说明:

  • XMLName:可选,用于匹配根元素名称
  • attr:表示该字段对应XML属性而非子元素

3. 生成XML:序列化结构体

使用xml.Marshalxml.MarshalIndent可将结构体转换为XML字符串。

b := Book{
    ID:       "456",
    Category: "web",
    Title:    "Web Dev with Go",
    Author:   "Jane Smith",
}
output, err := xml.MarshalIndent(b, "", "  ")
if err != nil {
    log.Fatal(err)
}
fmt.Println(xml.Header + string(output))

输出结果会包含标准XML头和格式化内容:



  Web Dev with Go
  Jane Smith

4. 处理复杂结构:切片与嵌套元素

当XML包含多个同名子元素时,可用切片接收。

示例:


  Go Intro
  Advanced Go

结构体定义:

type Library struct {
    Books []Book `xml:"book"`
}

解析后,Books切片会自动填充两个Book实例。

基本上就这些。encoding/xml包设计直观,结合结构体标签能应对大多数XML场景。注意字段必须是导出的(大写开头),否则无法被解析或序列化。对于不规则XML,也可使用xml.Decoder进行流式逐节点处理,但多数情况结构体方式更清晰高效。