使用Golang解析Yaml、Json、Xml文件

开发 后端
YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。

[[426775]]

本文转载自微信公众号「运维开发故事」,作者wanger 。转载本文请联系运维开发故事公众号。

大家好,我是wanger。

解析和生成yaml文件

YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。我们使用 yaml.v3 包来解析yaml文件

  1. go get gopkg.in/yaml.v3 

解析yaml

  1. func Unmarshal(in []byte, out interface{}) (err error) 

我们使用 Unmarshal来解析yaml yaml文件内容如下:

  1. name: wanger 
  2.   age: 24 
  3.   address: beijing 
  4.   hobby: 
  5.     - literature 
  6.     - social 
  7. name: 冬哥 
  8.   age: 30 
  9.   address: chengdu 
  10.   hobby: 
  11.     - basketball 
  12.     - guitar 
  13. name: 华子 
  14.   age: 27 
  15.   address: shenzhen 
  16.   hobby: 
  17.     - 王者荣耀 
  18. name: 乔克 
  19.   age: 29 
  20.   address: chongqing 
  21.   hobby: 
  22.     - 阅读 
  23.     - 王者荣耀 
  24. name: 夏老师 
  25.   age: 27 
  26.   address: chengdu 
  27.   hobby: 
  28.     - 吃吃喝喝 
  29. name: 姜总 
  30.   age: 25 
  31.   address: shanghai 
  32.   hobby: 
  33.     - talkshow 
  34. name: 郑哥 
  35.   age: 30 
  36.   address: beijing 
  37.   hobby: 
  38.     - 阅读 
  39.     - 复读机 

读取test.yaml

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "gopkg.in/yaml.v2" 
  6.  "io/ioutil" 
  7.  "gopkg.in/yaml.v3" 
  8.  "log" 
  9.  
  10.  
  11.  
  12. type Users struct { 
  13.  Name   string      `yaml:"name"
  14.  Age    int8        `yaml:"age"
  15.  Address  string `yaml:"address"
  16.  Hobby []string `yaml:"hobby"
  17.  
  18.  
  19. func main() { 
  20.  
  21.  file, err := ioutil.ReadFile("test.yaml"
  22.  if err != nil { 
  23.   log.Fatal(err) 
  24.  } 
  25.  var data [7]Users 
  26.  err2 := yaml.Unmarshal(file, &data) 
  27.  
  28.  if err2 != nil { 
  29.   log.Fatal(err2) 
  30.  } 
  31.  for _, v := range data { 
  32.   fmt.Println(v) 
  33.  } 

输出内容如下

  1. {wanger 24 beijing [literature social]} 
  2. {冬哥 30 chengdu [basketball guitar]} 
  3. {华子 27 shenzhen [王者荣耀]} 
  4. {乔克 29 chongqing [阅读 王者荣耀]} 
  5. {夏老师 27 chengdu [吃吃喝喝]} 
  6. {姜总 25 shanghai [钓鱼  音乐 美食  酒talkshow]} 
  7. {郑哥 30 beijing [阅读 复读机]} 

生成yaml

  1. func Marshal(in interface{}) (out []byte, err error) 

我们使用 Marshal来生成yaml,生成一个关于我们团队信息的yaml文件吧 可以通过定义结构体yaml标签来自定义输出的yaml文件的键名

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "gopkg.in/yaml.v3" 
  6.  
  7.  
  8.  
  9. type Users struct { 
  10.  Name   string      `yaml:"name"
  11.  Age    int8        `yaml:"age"
  12.  Address  string `yaml:"address"
  13.  Hobby []string `yaml:"hobby"
  14.  
  15.  
  16. func main() { 
  17.  wanger := Users{ 
  18.   Name"wanger"
  19.   Age:  24, 
  20.   Address: "beijing"
  21.   Hobby: []string{"literature""social"}, 
  22.  } 
  23.  dongdong := Users{ 
  24.   Name"冬哥"
  25.   Age:  30, 
  26.   Address: "chengdu"
  27.   Hobby: []string{"basketball""guitar"}, 
  28.  } 
  29.  xialaoshi := Users{ 
  30.   Name"夏老师"
  31.   Age:  29, 
  32.   Address: "chengdu"
  33.   Hobby: []string{"吃吃喝喝"}, 
  34.  } 
  35.  huazai := Users{ 
  36.   Name"华子"
  37.   Age:  28, 
  38.   Address: "shenzhen"
  39.   Hobby: []string{"王者荣耀"}, 
  40.  } 
  41.  qiaoke := Users{ 
  42.   Name"乔克"
  43.   Age:  30, 
  44.   Address: "chongqing"
  45.   Hobby: []string{"阅读""王者荣耀"}, 
  46.  } 
  47.  jiangzong := Users{ 
  48.   Name"姜总"
  49.   Age:  25, 
  50.   Address: "shanghai"
  51.   Hobby: []string{"钓鱼","音乐","美食","酒"}, 
  52.  } 
  53.  zhengge := Users{ 
  54.   Name"郑哥"
  55.   Age:  30, 
  56.   Address: "beijing"
  57.   Hobby: []string{"阅读""复读机"}, 
  58.  } 
  59.     userlist:=[7]Users{wanger,dongdong,huazai,qiaoke,xialaoshi,jiangzong,zhengge} 
  60.  
  61.  yamlData, err := yaml.Marshal(&userlist) 
  62.  
  63.  if err != nil { 
  64.   fmt.Printf("Error while Marshaling. %v", err) 
  65.  } 
  66.  
  67.  fmt.Println(string(yamlData)) 
  68.     fileName := "test.yaml" 
  69.     err = ioutil.WriteFile(fileName, yamlData, 0644) 
  70.     if err != nil { 
  71.         panic("Unable to write data into the file"
  72.     } 
  73. }     

生成的yaml信息如下

  1. name: wanger 
  2.   age: 24 
  3.   address: beijing 
  4.   hobby: 
  5.     - literature 
  6.     - social 
  7. name: 冬哥 
  8.   age: 30 
  9.   address: chengdu 
  10.   hobby: 
  11.     - basketball 
  12.     - guitar 
  13. name: 华子 
  14.   age: 27 
  15.   address: shenzhen 
  16.   hobby: 
  17.     - 王者荣耀 
  18. name: 乔克 
  19.   age: 29 
  20.   address: chongqing 
  21.   hobby: 
  22.     - 阅读 
  23.     - 王者荣耀 
  24. name: 夏老师 
  25.   age: 27 
  26.   address: chengdu 
  27.   hobby: 
  28.     - 吃吃喝喝 
  29. name: 姜总 
  30.   age: 25 
  31.   address: shanghai 
  32.   hobby: 
  33.     - 钓鱼   
  34.     - 音乐 
  35.     - 美食  
  36.     - 酒 
  37. name: 郑哥 
  38.   age: 30 
  39.   address: beijing 
  40.   hobby: 
  41.     - 阅读 
  42.     - 复读机 

解析和生成json文件

我们使用encoding/json标准库包来实现json文件的解析与生成

读取和解析json文件

  1. func Unmarshal(data []byte, v interface{}) error 

我这里定义了一个user.json文件

  1.   "users": [ 
  2.     { 
  3.       "name""wanger"
  4.       "address""beijing"
  5.       "age": 24, 
  6.       "social": { 
  7.         "mobile""111111111"
  8.         "email""wanger@163.com" 
  9.       } 
  10.     }, 
  11.     { 
  12.       "name""dongdong"
  13.       "address""chengdu"
  14.       "age": 30, 
  15.       "social": { 
  16.         "mobile""2222222222222222"
  17.         "emial""dongdong@163.com" 
  18.       } 
  19.     }, 
  20.     { 
  21.       "name""夏老师"
  22.       "address""chengdu"
  23.       "age": 29, 
  24.       "social": { 
  25.         "mobile""2232222222222222"
  26.         "emial""xialaoshi@163.com" 
  27.       } 
  28.     }, 
  29.     { 
  30.       "name""郑哥"
  31.       "address""beijing"
  32.       "age": 30, 
  33.       "social": { 
  34.         "mobile""12222211111"
  35.         "email""zhengge@163.com" 
  36.       } 
  37.     }, 
  38.     { 
  39.       "name""姜总"
  40.       "address""shanghai"
  41.       "age": 25, 
  42.       "social": { 
  43.         "mobile""111122211"
  44.         "email""jaingzong@163.com" 
  45.       } 
  46.     }, 
  47.     { 
  48.       "name""乔克"
  49.       "address""chongqing"
  50.       "age": 30, 
  51.       "social": { 
  52.         "mobile""11333331111111"
  53.         "email""qiaoke@163.com" 
  54.       } 
  55.     }, 
  56.     { 
  57.       "name""华仔"
  58.       "address""shenzhen"
  59.       "age": 28, 
  60.       "social": { 
  61.         "mobile""113311111"
  62.         "email""huazai@163.com" 
  63.       } 
  64.     } 
  65.   ] 

读取user.json文件

  1. package main 
  2.  
  3. import ( 
  4.  "encoding/json" 
  5.  "fmt" 
  6.  "io/ioutil" 
  7.  "os" 
  8.  "strconv" 
  9. func main() { 
  10.  jsonFile,err:=os.Open("user.json"
  11.  if err != nil { 
  12.   fmt.Println(err) 
  13.  } 
  14.  fmt.Println("Successfully Opened users.json"
  15.  defer jsonFile.Close() 
  16.  byteValue,_:=ioutil.ReadAll(jsonFile) 
  17.  var users Users 
  18.  json.Unmarshal(byteValue,&users) 
  19.  for i :=0;i<len(users.Users);i++ { 
  20.   fmt.Println("User Type: "+ users.Users[i].Address) 
  21.   fmt.Println("User Age: "+strconv.Itoa(users.Users[i].Age)) 
  22.   fmt.Println("User Name: "+users.Users[i].Name
  23.   fmt.Println("User Email: "+users.Users[i].Social.Email) 
  24.  } 
  25.  var result Users 
  26.  json.Unmarshal(byteValue,&result) 
  27. type Users struct { 
  28.  Users []User `json:"users"
  29. type User struct { 
  30.  Name string `json:"name"
  31.  Address string `json:"address"
  32.  Age int `json:"Age"
  33.  Social Social `json:"social"
  34. type Social struct { 
  35.  Mobile string `json:"mobile"
  36.  Email string `json:"email"

输出结果如下

  1. Successfully Opened users.json 
  2. User Type: beijing 
  3. User Age: 24 
  4. User Name: wanger 
  5. User Email: wanger@163.com 
  6. User Type: chengdu 
  7. User Age: 30 
  8. User Name: dongdong 
  9. User Email:  
  10. User Type: chengdu 
  11. User Age: 28 
  12. User Name: 夏老师 
  13. User Email:  
  14. User Type: beijing 
  15. User Age: 30 
  16. User Name: 郑哥 
  17. User Email: zhengge@163.com 
  18. User Type: shanghai 
  19. User Age: 25 
  20. User Name: 姜总 
  21. User Email: jaingzong@163.com 
  22. User Type: chongqing 
  23. User Age: 29 
  24. User Name: 乔克 
  25. User Email: qiaoke@163.com 
  26. User Type: shenzhen 
  27. User Age: 28 
  28. User Name: 华仔 
  29. User Email: huazai@163.com 

当然有时候我们可能不知道要读取的json数据结构,这就没办法预定义结构体,那么我们可以使用**map[string]interface{}**类型来解析json。

  1. var result map[string]interface{} 
  2. err = json.Unmarshal(byteValue, &result) 
  3. fmt.Printf("%+v\n", result) 

输出信息如下:

  1. map[users:[map[address:beijing age:24 name:wanger social:map[email:wanger@163.com mobile:111111]] map[address:chengdu age:30 name:dongdong social:map[emial:dongdong@163.com mobil222222222222222]] map[address:chengdu age:28 name:夏老师 social:map[emial:xialaoshi@163.cmobile:2232222222222222]] map[address:beijing age:30 name:郑哥 social:map[email:zhengge@1com mobile:12222211111]] map[address:shanghai age:25 name:姜总 social:map[email:jaingzong3.com mobile:111122211]] map[address:chongqing age:29 name:乔克 social:map[email:qiaoke@1com mobile:11333331111111]] map[address:shenzhen age:28 name:华仔 social:map[email:huazai3.com mobile:113311111]]]] 

生成json文件

  1. func Marshal(v interface{}) ([]byte, error) 
  2. package main 
  3.  
  4. import ( 
  5.  "encoding/json" 
  6.  "fmt" 
  7.  "io/ioutil" 
  8.  
  9. func main() { 
  10.  wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}} 
  11.  huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}} 
  12.  qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}} 
  13.  xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}} 
  14.  jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}} 
  15.  dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}} 
  16.  zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}} 
  17.  result:=Users{Users: []User{wanger,huazi,jiangzong,xialaoshi,qiaoke,dongdong,zhengge}} 
  18.  bytearray,err:=json.Marshal(result) 
  19.  if err!=nil { 
  20.   fmt.Println(err) 
  21.  } 
  22.  fmt.Println(string(bytearray)) 
  23.  fileName := "user.json" 
  24.  err = ioutil.WriteFile(fileName, bytearray, 0644) 
  25.  if err != nil { 
  26.   panic("Unable to write data into the file"
  27.  } 
  28. type Users struct { 
  29.  Users []User `json:"users"
  30. type User struct { 
  31.  Name string `json:"name"
  32.  Address string `json:"address"
  33.  Age int `json:"Age"
  34.  Social Social `json:"social"
  35. type Social struct { 
  36.  Mobile string `json:"mobile"
  37.  Email string `json:"email"

输出内容如下

  1. {"users":[{"name":"wanger","address":"beijing","Age":24,"social":{"mobile":"111111111111","email":"wanger@163.com"}},{"name":"huazai","address":"shenzhen","Age":28,"social":{"mobile":"111122211111","email":"huazai@163.com"}},{"name":"姜总","address":"shanghai","Age":25,"social":{"mobile":"111222445211111","email":"jiangzong@163.com"}},{"name":"夏老师","address":"chengdu","Age":29,"social":{"mobile":"11144445411111","email":"xialaoshi@163.com"}},{"name":"qiaoke","address":"chongqing","Age":30,"social":{"mobile":"13332211111","email":"qiaoke@163.com"}},{"name":"冬哥","address":"chengdu","Age":30,"social":{"mobile":"1155555211111","email":"dongdong@163.com"}},{"name":"郑哥","address":"beijing","Age":24,"social":{"mobile":"1112224566211111","email":"zhengge@163.com"}}]} 

可以看出上面输出的json并不是很美观,可以使用更易读的函数**json.MarshalIndent()**函数,MarshalIndent()可以定义输出的前缀和缩进

  1. bytearray,err:=json.MarshalIndent(result,""," "
  2. if err!=nil { 
  3.  fmt.Println(err) 
  4. fmt.Println(string(bytearray)) 

输出内容如下,比之前看起来好多了

  1.  "users": [ 
  2.   { 
  3.    "name""wanger"
  4.    "address""beijing"
  5.    "Age": 24, 
  6.    "social": { 
  7.     "mobile""111111111111"
  8.     "email""wanger@163.com" 
  9.    } 
  10.   }, 
  11.   { 
  12.    "name""huazai"
  13.    "address""shenzhen"
  14.    "Age": 28, 
  15.    "social": { 
  16.     "mobile""111122211111"
  17.     "email""huazai@163.com" 
  18.    } 
  19.   }, 
  20.   { 
  21.    "name""姜总"
  22.    "address""shanghai"
  23.    "Age": 25, 
  24.    "social": { 
  25.     "mobile""111222445211111"
  26.     "email""jiangzong@163.com" 
  27.    } 
  28.   }, 
  29.   { 
  30.    "name""夏老师"
  31.    "address""chengdu"
  32.    "Age": 29, 
  33.    "social": { 
  34.     "mobile""11144445411111"
  35.     "email""xialaoshi@163.com" 
  36.    } 
  37.   }, 
  38.   { 
  39.    "name""qiaoke"
  40.    "address""chongqing"
  41.    "Age": 30, 
  42.    "social": { 
  43.     "mobile""13332211111"
  44.     "email""qiaoke@163.com" 
  45.    } 
  46.   }, 
  47.   { 
  48.    "name""冬哥"
  49.    "address""chengdu"
  50.    "Age": 30, 
  51.    "social": { 
  52.     "mobile""1155555211111"
  53.     "email""dongdong@163.com" 
  54.    } 
  55.   }, 
  56.   { 
  57.    "name""郑哥"
  58.    "address""beijing"
  59.    "Age": 24, 
  60.    "social": { 
  61.     "mobile""1112224566211111"
  62.     "email""zhengge@163.com" 
  63.    } 
  64.   } 
  65.  ] 

解析和生成xml文件

解析xml文件

  1. func Unmarshal(data []byte, v interface{}) error 

定义一个user.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <users> 
  3.     <user address="beijing"
  4.         <name>wanger</name
  5.         <age>24</age> 
  6.         <social> 
  7.             <email>wanger@163.com</email> 
  8.             <mobile>1233455464</mobile> 
  9.         </social> 
  10.     </user
  11.     <user address="chengdu"
  12.         <name>冬哥</name
  13.         <age>30</age> 
  14.         <social> 
  15.             <email>dongge@163.com</email> 
  16.             <mobile>12245555464</mobile> 
  17.         </social> 
  18.     </user
  19.     <user address="chengdu"
  20.         <name>夏老师</name
  21.         <age>29</age> 
  22.         <social> 
  23.             <email>xialaoshi@163.com</email> 
  24.             <mobile>12335677464</mobile> 
  25.         </social> 
  26.     </user
  27.     <user address="beijing"
  28.         <name>郑哥</name
  29.         <age>30</age> 
  30.         <social> 
  31.             <email>zhengge@163.com</email> 
  32.             <mobile>12334355464</mobile> 
  33.         </social> 
  34.     </user
  35.     <user address="shanghai"
  36.         <name>姜总</name
  37.         <age>25</age> 
  38.         <social> 
  39.             <email>jiangzong@163.com</email> 
  40.             <mobile>123565455464</mobile> 
  41.         </social> 
  42.     </user
  43.     <user address="chongqing"
  44.         <name>乔克</name
  45.         <age>29</age> 
  46.         <social> 
  47.             <email>qiaoke@163.com</email> 
  48.             <mobile>124676755464</mobile> 
  49.         </social> 
  50.     </user
  51.     <user address="shenzhen"
  52.         <name>华仔</name
  53.         <age>28</age> 
  54.         <social> 
  55.             <email>huazai@163.com</email> 
  56.             <mobile>1238655464</mobile> 
  57.         </social> 
  58.     </user
  59. </users> 

解析xml文件 address,attr意味着该address字段是一个XML属性而不是一个嵌套元素。如果结构体有一个名为 XMLName 的 Name 类型的字段,Unmarshal 在该字段中记录元素名称。

为了正确解析,go 语言的 xml 包要求 struct 定义中的所有字段必须是可导出的(即首字母大写)

  1. package main 
  2.  
  3. import ( 
  4.  "encoding/xml" 
  5.  "fmt" 
  6.  "io/ioutil" 
  7.  "os" 
  8. func main() { 
  9.  
  10.  xmlFile,err:=os.Open("users.xml"
  11.  if err!=nil { 
  12.   fmt.Println(err) 
  13.  } 
  14.  fmt.Println("successfully opened users.xml"
  15.  defer xmlFile.Close() 
  16.  byteValue,_:=ioutil.ReadAll(xmlFile) 
  17.  var users Users 
  18.  xml.Unmarshal(byteValue,&users) 
  19.  for i :=0;i<len(users.Users);i++ { 
  20.   fmt.Println("User Address: "+users.Users[i].Address) 
  21.   fmt.Println("User Name: "+users.Users[i].Name
  22.   fmt.Println("Facebook Url: "+users.Users[i].Social.Email) 
  23.  } 
  24. type Users struct { 
  25.  XMLName xml.Name `xml:"users"
  26.  Users []User `xml:"user"
  27.  
  28. type User struct { 
  29.  XMLName xml.Name `xml:"user"
  30.  Address string `xml:"address,attr"
  31.  Name string `xml:"name"
  32.  Social Social `xml:"social"
  33. type Social struct { 
  34.  XMLName xml.Name `xml:"social"
  35.  Mobile string `xml:"mobile"
  36.  Email string `xml:"email"

输出结果如下:

  1. successfully opened users.xml 
  2. User Address: beijing 
  3. User Name: wanger 
  4. Facebook Url: wanger@163.com 
  5. User Address: chengdu 
  6. User Name: 冬哥 
  7. Facebook Url: dongge@163.com 
  8. User Address: chengdu 
  9. User Name: 夏老师 
  10. Facebook Url: xialaoshi@163.com 
  11. User Address: beijing 
  12. User Name: 郑哥 
  13. Facebook Url: zhengge@163.com 
  14. User Address: shanghai 
  15. User Name: 姜总 
  16. Facebook Url: jiangzong@163.com 
  17. User Address: chongqing 
  18. User Name: 乔克 
  19. Facebook Url: qiaoke@163.com 
  20. User Address: shenzhen 
  21. User Name: 华仔 
  22. Facebook Url: huazai@163.com 

生成xml文件

  1. func Marshal(v interface{}) ([]byte, error) 
  2. func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) 

可以使用Marshal()函数和MarshalIndent()函数,之前的json和yaml包里也有用到,区别就是MarshalIndent()可以添加 前缀和缩进,看起来更美观一点,Marshal 和MarshalIndent通过编写一个或多个包含数据的 XML 元素来处理所有其他数据。

  1. package main 
  2.  
  3. import ( 
  4.  "encoding/xml" 
  5.  "fmt" 
  6.  "io/ioutil" 
  7. func main() { 
  8.  wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}} 
  9.  huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}} 
  10.  qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}} 
  11.  xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}} 
  12.  jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}} 
  13.  dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}} 
  14.  zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}} 
  15.     v:=&Users{Users: []User{wanger,huazi,qiaoke,xialaoshi,zhengge,jiangzong,dongdong}} 
  16.  
  17.  result, err := xml.MarshalIndent(v, "  ""    "
  18.  if err != nil { 
  19.   fmt.Printf("error: %v\n", err) 
  20.  } 
  21.  fmt.Println(string(result)) 
  22.  fileName := "users.xml" 
  23.  err = ioutil.WriteFile(fileName, result, 0644) 
  24.  if err != nil { 
  25.   panic("Unable to write data into the file"
  26.  } 
  27. type Users struct { 
  28.  XMLName xml.Name `xml:"users"
  29.  Users []User `xml:"user"
  30.  
  31. type User struct { 
  32.  XMLName xml.Name `xml:"user"
  33.  Age int64 `xml:"age"
  34.  Address string `xml:"address,attr"
  35.  Name string `xml:"name"
  36.  Social Social `xml:"social"
  37. type Social struct { 
  38.  XMLName xml.Name `xml:"social"
  39.  Mobile string `xml:"mobile"
  40.  Email string `xml:"email"

输出信息如下

  1. <users> 
  2.      <user address="beijing"
  3.          <age>24</age> 
  4.          <name>wanger</name
  5.          <social> 
  6.              <mobile>111111111111</mobile> 
  7.              <email>wanger@163.com</email> 
  8.          </social> 
  9.      </user
  10.      <user address="shenzhen"
  11.          <age>28</age> 
  12.          <name>huazai</name
  13.          <social> 
  14.              <mobile>111122211111</mobile> 
  15.              <email>huazai@163.com</email> 
  16.          </social> 
  17.      </user
  18.      <user address="chongqing"
  19.          <age>30</age> 
  20.          <name>qiaoke</name
  21.          <social> 
  22.              <mobile>13332211111</mobile> 
  23.              <email>qiaoke@163.com</email> 
  24.          </social> 
  25.      </user
  26.      <user address="chengdu"
  27.          <age>29</age> 
  28.          <name>夏老师</name
  29.          <social> 
  30.              <mobile>11144445411111</mobile> 
  31.              <email>xialaoshi@163.com</email> 
  32.          </social> 
  33.      </user
  34.      <user address="beijing"
  35.          <age>24</age> 
  36.          <name>郑哥</name
  37.          <social> 
  38.              <mobile>1112224566211111</mobile> 
  39.              <email>zhengge@163.com</email> 
  40.          </social> 
  41.      </user
  42.      <user address="shanghai"
  43.          <age>25</age> 
  44.          <name>姜总</name
  45.          <social> 
  46.              <mobile>111222445211111</mobile> 
  47.              <email>jiangzong@163.com</email> 
  48.          </social> 
  49.      </user
  50.      <user address="chengdu"
  51.          <age>30</age> 
  52.          <name>冬哥</name
  53.          <social> 
  54.              <mobile>1155555211111</mobile> 
  55.              <email>dongdong@163.com</email> 
  56.          </social> 
  57.      </user
  58.  </users> 

文中所有代码已同步到我们的github组织sunsharing-note可阅读原文访问

 

责任编辑:武晓燕 来源: 运维开发故事
相关推荐

2020-12-02 11:18:28

Golang GinW

2022-03-22 09:41:31

Java编程语言持久化

2019-03-29 08:25:21

JSONXML前端

2010-07-26 15:06:29

Perl解析XML文件

2010-01-25 18:22:33

Android使用XM

2020-12-22 10:29:43

漏洞SAML认证补丁

2011-07-19 09:08:38

jQuery

2009-04-23 13:19:21

创建XMLXML文件Javascript

2023-05-05 07:49:07

GolangJSON格式

2011-07-27 17:24:31

iPhone NSXMLParse XML

2010-06-12 16:30:51

UML设计

2022-04-11 08:25:37

XMLSQL语句Mybatis

2024-01-23 09:02:35

PyYAML库PythonYAML

2013-06-08 13:29:27

Android开发DOM读取XMLXML解析

2011-06-15 09:02:01

Qt QDomDocume XML

2021-07-13 05:47:40

GroovyJSON软件开发

2009-12-02 14:14:06

PHP DOM-XML

2009-06-10 21:51:42

JavaScript XMLFirefox

2009-11-02 11:02:58

VB.NET XML文

2019-02-11 08:48:07

XMLJSON前端
点赞
收藏

51CTO技术栈公众号