xml 序列化和反序列化

这一节课将介绍 xml 的序列化和反序列化。

首先看下 xml 标签常见用法:

  • xml:"xxx,omitempty" 代表如果这个字段值为空,则序列化时忽略该字段
  • xml:"xxx,attr" 代表该字段为 xml 标签的属性说明
  • xml:"-" 代表序列化时忽略该字段
  • xml:"a>b>c" 代表 xml 标签嵌套模式

以下例子,演示了

  • xml 序列化,包含 xml 标签的不同用法
  • 写 xml 文件
  • 读 xml 文件
  • xml 反序列化
  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "io/ioutil"
  6. )
  7. type Student struct {
  8. Name string `xml:"name"` // xml 标签
  9. Address string `xml:"address,omitempty"` // 如果该字段为空就过滤掉
  10. Hobby string `xml:"-"` // 进行 xml 序列化的时候忽略该字段
  11. Father string `xml:"parent>father"` // xml 标签嵌套模式
  12. Mother string `xml:"parent>mother"` // xml 标签嵌套模式
  13. Note string `xml:"note,attr"` // xml 标签属性
  14. }
  15. func checkErr(err error) {
  16. if err != nil {
  17. panic(err)
  18. }
  19. }
  20. func main() {
  21. stu1 := Student{
  22. Name: "haha",
  23. Hobby: "basketball",
  24. }
  25. // data, _ := xml.Marshal(s)
  26. // fmt.Println(string(data))
  27. // xml 序列化
  28. newData, err := xml.MarshalIndent(stu1, " ", " ")
  29. checkErr(err)
  30. fmt.Println(string(newData))
  31. // 写 xml 文件
  32. err = ioutil.WriteFile("stu.xml", newData, 0644)
  33. checkErr(err)
  34. // 读 xml 文件
  35. content, err := ioutil.ReadFile("stu.xml")
  36. stu2 := &Student{}
  37. // xml 反序列化
  38. err = xml.Unmarshal(content, stu2) // 注意:第二个参数必须是指针
  39. checkErr(err)
  40. fmt.Printf("stu2: %#v\n", stu2)
  41. }