go-doc-xml

规则

  • XMLName字段,会省略
  • 具有标签”-“的字段会省略
  • 具有标签”name,attr”的字段会成为该XML元素的名为name的属性
  • 具有标签”,attr”的字段会成为该XML元素的名为字段名的属性
  • 具有标签”,chardata”的字段会作为字符数据写入,而非XML元素
  • 具有标签”,innerxml”的字段会原样写入,而不会经过正常的序列化过程
  • 具有标签”,comment”的字段作为XML注释写入,而不经过正常的序列化过程,该字段内不能有”–”字符串
  • 标签中包含”omitempty”选项的字段如果为空值会省略
    空值为false、0、nil指针、nil接口、长度为0的数组、切片、映射
  • 匿名字段(其标签无效)会被处理为其字段是外层结构体的字段
  • 如果一个字段的标签为”a>b>c”,则元素c将会嵌套进其上层元素a和b中。如果该字段相邻的字段标签指定了同样的上层元素,则会放在同一个XML元素里。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main

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


type SConfig struct {
XMLName xml.Name `xml:"config"` // 指定最外层的标签为config
SmtpServer string `xml:"smtpServer"` // 读取smtpServer配置项,并将结果保存到SmtpServer变量中
SmtpPort int `xml:"smtpPort"`
Sender string `xml:"sender"`
SenderPasswd string `xml:"senderPasswd"`
Receivers SReceivers `xml:"receivers"` // 读取receivers标签下的内容,以结构方式获取
}

type SReceivers struct {
Flag string `xml:"flag,attr"` // 读取flag属性
User []string `xml:"user"` // 读取user数组
}

func main() {
file, err := os.Open("servers.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := SConfig{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}

fmt.Println(v)
fmt.Println("SmtpServer : ",v.SmtpServer)
fmt.Println("SmtpPort : ",v.SmtpPort)
fmt.Println("Sender : ",v.Sender)
fmt.Println("SenderPasswd : ",v.SenderPasswd)
fmt.Println("Receivers.Flag : ",v.Receivers.Flag)
for i,element := range v.Receivers.User {
fmt.Println(i,element)
}
}
1
2
3
4
5
6
7
8
9
10
11
<config>
<smtpServer>smtp.163.com</smtpServer>
<smtpPort>25</smtpPort>
<sender>user@163.com</sender>
<senderPasswd>123456</senderPasswd>
<receivers flag="true">
<age>16</age>
<user>Mike_Zhang@live.com</user>
<user>test1@qq.com</user>
</receivers>
</config>