xml - 如何在 Go 中解码具有多个项目的简单 xml?

标签 xml go unmarshalling

我想从以下 xml 中获取一部分人 ([]People):

<file>
    <person>
        <name>John Doe</name>
        <age>18</age>
    </person>
    <person>
        <name>Jane Doe</name>
        <age>20</age>
    </person>
</file>

(所有其他类似问题都太具体和冗长)

最佳答案

您需要创建两个结构:

  • 一个代表<file> </file>
  • 一个用于重复记录<person> </person>

请看代码里面的注释:

package main

import (
    "encoding/xml"
    "fmt"
)

var sourceXML = []byte(`<file>
    <person>
        <name>John Doe</name>
        <age>18</age>
    </person>
    <person>
        <name>Jane Doe</name>
        <age>20</age>
    </person>
</file>`)

// Define a structure for each record
type Person struct {
    Name string `xml:"name"`
    Age  int    `xml:"age"`
}

// There needs to be a single struct to unmarshal into
// File acts like that one root struct
type File struct {
    People []Person `xml:"person"`
}

func main() {
    // Initialize an empty struct
    var file File

    err := xml.Unmarshal(sourceXML, &file)
    if err != nil {
        fmt.Println(err)
    }
    // file.People returns only the []Person rather than the root
    // file struct with it's contents
    fmt.Printf("%+v", file.People)
}
// output:
// [{Name:John Doe Age:18} {Name:Jane Doe Age:20}]

编辑。 Kaedys 说 File 和 Person 结构也可以嵌套(使用匿名结构),如下所示:

type File struct {
    People []struct {
        Name string `xml:"name"`
        Age  int    `xml:"age"`
    } `xml:"person"`
}

关于xml - 如何在 Go 中解码具有多个项目的简单 xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54460279/

相关文章:

java - Generic Map<String, Object> 使用 Moxy 进行 JSON 编码和解码

sql - 解析某些 xml 时遇到问题

amazon-web-services - AWS X-Ray GoLang Lambda 到 lambda 跟踪并显示在服务 map 中

java - 不带模式解码 xml

go - 协程和 `goto` 之间的区别?

go - 如何在不使用time.Sleep的情况下等待所有goroutine完成?

json - Go json unmarshal 不获取单个属性值

java - JAXB 将 xml 列表元素解码为单个 Kotlin 对象

android - Android 中的右可绘制对象。不工作

java - 在tomcat上获取变量的描述