操作系統: CentOS 6.9_x64
go語言版本: 1.8.3
問題描述
現有一個自動報障程序,如果服務出錯會自動給指定人發送郵件,配置文件內容如下(default.xml):
1
2
3
4
5
6
7
8
9
10
11
|
<? xml version = "1.0" encoding = "UTF-8" ?> < config > < smtpServer >smtp.163.com</ smtpServer > < smtpPort >25</ smtpPort > < senderPasswd >123456</ senderPasswd > < receivers flag = "true" > </ receivers > </ config > |
該配置以config為root標簽,有xml text部分(比如smtpServer標簽)、嵌套xml(receivers標簽)、有xml attribute部分(receivers標簽的flag)、類似數組的多行配置(user標簽), 數據類型有字符串和數字兩種類型。
解決方案
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
|
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("default.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
12
|
[root@local t1]# ls default.xml xmlCnfTest1.go [root@local t1]# go run xmlCnfTest1.go {{ config} smtp.163.com 25 [email protected] 123456 {true [[email protected] [email protected]]}} SmtpServer : smtp.163.com SmtpPort : 25 Sender : [email protected] SenderPasswd : 123456 Receivers.Flag : true [root@local t1]# |
討論
如果需要直接從字符串解析xml配置,可將如下語句中的data替換即可:
1
|
err = xml.Unmarshal(data, &v) |
比如:
1
|
err = xml.Unmarshal([]byte(ConfigContent), &v) // ConfigContent為xml字符串 |
好,就這些了,希望對你有幫助。
以上這篇使用go語言解析xml的實現方法(必看篇)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。