package main

import (
	"encoding/xml"
	"fmt"
)

type person struct {
	Name string
	Age int
}

func main() {
	p := person{Name: "张三", Age: 18}

	//无缩进生成xml
	if data, err := xml.Marshal(p); err != nil {
		fmt.Println(err)
		return
	}else{ //注意,else也在if data, err := xml.Marshal(p); err != nil作用域内,放在外面会找不到data
		fmt.Println(string(data))
		fmt.Println()
	}

	//有缩进生成xml(第二个参数:在每行的开头加的前缀。第三个参数:缩进)
	if data, err := xml.MarshalIndent(p, "", "	"); err != nil {
		fmt.Println(err)
		return
	}else{ //注意,else也在if data, err := xml.Marshal(p); err != nil作用域内,放在外面会找不到data
		fmt.Println(string(data))
		fmt.Println()
	}

	//全局输出(不用包含在if-else里)
	var data []byte
	var err error
	if data, err = xml.MarshalIndent(p, "#", "	"); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(data))
	fmt.Println()

	//反序列化
	p2 := new(person)
	if err = xml.Unmarshal(data, p2);err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(p2)
	fmt.Println()

	//加上属性
	type new_person struct {
		Name string `xml:"name,attr"`
		Age int
	}
	new_p := new_person{Name: "lucy", Age: 18}
	if data, err := xml.Marshal(new_p); err != nil {
		fmt.Println(err)
		return
	}else{ //注意,else也在if data, err := xml.Marshal(p); err != nil作用域内,放在外面会找不到data
		fmt.Println(string(data))
		fmt.Println()
	}

}

输出: