Go:
处理XML

如何进行:

在 Go 中解析 XML

要在 Go 中解析 XML,你需要使用 encoding/xml 包。这个包提供了将 XML 反序列化(解析)为 Go 结构体所需的工具。例如,考虑以下表示书籍的 XML 数据:

<book id="123">
    <title>Learning Go</title>
    <author>John Doe</author>
    <pages>359</pages>
</book>

要解析这个,定义一个反映 XML 结构的结构体:

package main

import (
    "encoding/xml"
    "fmt"
    "os"
)

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

func main() {
    data := []byte(`
<book id="123">
    <title>Learning Go</title>
    <author>John Doe</author>
    <pages>359</pages>
</book>
`)

    var book Book
    err := xml.Unmarshal(data, &book)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Book: %+v\n", book)
}

输出:

Book: {XMLName:{Space: Local:book} ID:123 Title:Learning Go Author:John Doe Pages:359}

在 Go 中生成 XML

为了从 Go 数据结构生成 XML 文档,你再次使用 encoding/xml 包。这次你将 Go 结构体序列化为 XML。考虑之前的 Book 结构体:

package main

import (
    "encoding/xml"
    "fmt"
    "os"
)

func main() {
    book := &Book{
        ID:     "123",
        Title:  "Learning Go",
        Author: "John Doe",
        Pages:  359,
    }

    output, err := xml.MarshalIndent(book, "", "    ")
    if err != nil {
        panic(err)
    }

    fmt.Println(xml.Header + string(output))
}

输出:

<?xml version="1.0" encoding="UTF-8"?>
<book id="123">
    <title>Learning Go</title>
    <author>John Doe</author>
    <pages>359</pages>
</book>

深入探讨

XML 的冗长和复杂性导致 JSON 和其他格式在许多应用程序中变得更受欢迎。然而,XML 在表示复杂的层次数据以及它在遗留系统和特定领域(例如,SOAP 服务)中的广泛使用上,确保了其相关性。

Go 中的 encoding/xml 包提供了强大的机制来处理 XML,但值得注意的是,它存在限制。例如,处理 XML 命名空间可能很麻烦,并且可能需要比简单使用案例更详细地了解 XML 规范。此外,尽管 Go 的静态类型及其 encoding/xml 包的序列化和反序列化能力通常是高效的,开发人员在处理深层嵌套结构或处理不容易映射到 Go 的类型系统上的 XML 文档时可能会遇到挑战。

对于大多数现代应用程序而言,像 JSON 这样的替代品更简单、更高效。然而,在需要使用 XML 的情况下——由于遗留系统、特定行业标准或复杂数据表示需求——Go 的标准库提供了强大的工具来完成工作。一如既往,数据格式的最佳选择取决于应用程序和环境的具体要求。