Golang如何将XML字符串反序列化为结构体

Golang如何将XML字符串反序列化为结构体 Go Playground - Go 编程语言

2 回复

Go Playground - The Go Programming Language

更多关于Golang如何将XML字符串反序列化为结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,可以使用encoding/xml包将XML字符串反序列化为结构体。以下是一个完整的示例:

package main

import (
    "encoding/xml"
    "fmt"
)

// 定义与XML对应的结构体
type Person struct {
    XMLName xml.Name `xml:"person"`
    Name    string   `xml:"name"`
    Age     int      `xml:"age"`
    Email   string   `xml:"email"`
}

func main() {
    // XML字符串
    xmlData := `
    <person>
        <name>张三</name>
        <age>30</age>
        <email>zhangsan@example.com</email>
    </person>
    `

    // 反序列化
    var person Person
    err := xml.Unmarshal([]byte(xmlData), &person)
    if err != nil {
        fmt.Printf("反序列化失败: %v\n", err)
        return
    }

    // 输出结果
    fmt.Printf("姓名: %s\n", person.Name)
    fmt.Printf("年龄: %d\n", person.Age)
    fmt.Printf("邮箱: %s\n", person.Email)
}

对于嵌套的XML结构:

package main

import (
    "encoding/xml"
    "fmt"
)

type Address struct {
    City    string `xml:"city"`
    Country string `xml:"country"`
}

type Employee struct {
    XMLName xml.Name `xml:"employee"`
    ID      int      `xml:"id,attr"`  // 属性
    Name    string   `xml:"name"`
    Dept    string   `xml:"department"`
    Address Address  `xml:"address"`
}

func main() {
    xmlData := `
    <employee id="1001">
        <name>李四</name>
        <department>技术部</department>
        <address>
            <city>北京</city>
            <country>中国</country>
        </address>
    </employee>
    `

    var emp Employee
    err := xml.Unmarshal([]byte(xmlData), &emp)
    if err != nil {
        fmt.Printf("反序列化失败: %v\n", err)
        return
    }

    fmt.Printf("ID: %d\n", emp.ID)
    fmt.Printf("姓名: %s\n", emp.Name)
    fmt.Printf("部门: %s\n", emp.Dept)
    fmt.Printf("城市: %s\n", emp.Address.City)
    fmt.Printf("国家: %s\n", emp.Address.Country)
}

处理XML数组:

package main

import (
    "encoding/xml"
    "fmt"
)

type Users struct {
    XMLName xml.Name `xml:"users"`
    Users   []User   `xml:"user"`
}

type User struct {
    XMLName xml.Name `xml:"user"`
    ID      string   `xml:"id,attr"`
    Name    string   `xml:"name"`
}

func main() {
    xmlData := `
    <users>
        <user id="1">
            <name>用户1</name>
        </user>
        <user id="2">
            <name>用户2</name>
        </user>
    </users>
    `

    var users Users
    err := xml.Unmarshal([]byte(xmlData), &users)
    if err != nil {
        fmt.Printf("反序列化失败: %v\n", err)
        return
    }

    for _, user := range users.Users {
        fmt.Printf("ID: %s, 姓名: %s\n", user.ID, user.Name)
    }
}

使用xml.Unmarshal函数时需要注意:

  1. 结构体字段标签中的xml标签指定了XML元素的对应关系
  2. ,attr表示对应XML属性
  3. XMLName字段用于指定根元素名称
  4. 结构体字段名首字母必须大写才能被导出
回到顶部