49-xml

// Go使用encoding.xml包提供对XML和类XML格式的内置支持。

package main

import (
	"encoding/xml"
	"fmt"
)

// Plant 结构体将被映射为XML
// 与JSON示例类似,字段标记包含编辑器和解码器的指令
// 使用XML包的一些特殊功能:
//  1. XMLName字段名称表示此结构的XML元素的名称
//  2. id,attr表示id字段是XML的属性而不是嵌套元素
type Plant struct {
	XMLName xml.Name `xml:"plant"`
	ID      int      `xml:"id,attr"`
	Name    string   `xml:"name"`
	Origin  []string `xml:"origin"`
}

func (p Plant) String() string {
	return fmt.Sprintf("Plant id = %v, name = %v, origin = %v", p.ID, p.Name, p.Origin)
}

func main() {
	coffee := &Plant{ID: 27, Name: "Coffee"}
	coffee.Origin = []string{"Ethiopia", "Brazil"}

	//使用MarshalIndent来生成更易读取的输出
	out, _ := xml.MarshalIndent(coffee, " ", " ")
	fmt.Println(string(out))

	// 要将通用XML标头添加到输出,需要显式添加它
	fmt.Println(xml.Header + string(out))

	// 使用Unmarshal将带有XML的字节流解析为数据结构
	// 如果XML格式错误或无法映射到Plant,将返回错误性描述
	var p Plant
	if err := xml.Unmarshal(out, &p); err != nil {
		panic(err)
	}
	fmt.Println(p)

	tomato := &Plant{ID: 81, Name: "Tomato"}
	tomato.Origin = []string{"Mexico", "California"}

	type Nesting struct {
		XMLName xml.Name `xml:"nesting"`
		Plants  []*Plant `xml:"parent>child>plant` // parent> child> plant field标记告诉编码器将所有植物嵌套在<parent> <child>下
	}

	nesting := &Nesting{}
	nesting.Plants = []*Plant{coffee, tomato}

	out, _ = xml.MarshalIndent(nesting, " ", " ")
	fmt.Println(string(out))
}
上次修改: 10 January 2020