操作系統(tǒng): CentOS 6.9_x64
go語言版本: 1.8.3
問題描述
現(xiàn)有一個自動報障程序,如果服務(wù)出錯會自動給指定人發(fā)送郵件,配置文件內(nèi)容如下(default.xml):
?xml version="1.0" encoding="UTF-8"?>
config>
smtpServer>smtp.163.com/smtpServer>
smtpPort>25/smtpPort>
sender>user@163.com/sender>
senderPasswd>123456/senderPasswd>
receivers flag="true">
user>Mike_Zhang@live.com/user>
user>test1@qq.com/user>
/receivers>
/config>
該配置以config為root標簽,有xml text部分(比如smtpServer標簽)、嵌套xml(receivers標簽)、有xml attribute部分(receivers標簽的flag)、類似數(shù)組的多行配置(user標簽), 數(shù)據(jù)類型有字符串和數(shù)字兩種類型。
解決方案
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type SConfig struct {
XMLName xml.Name `xml:"config"` // 指定最外層的標簽為config
SmtpServer string `xml:"smtpServer"` // 讀取smtpServer配置項,并將結(jié)果保存到SmtpServer變量中
SmtpPort int `xml:"smtpPort"`
Sender string `xml:"sender"`
SenderPasswd string `xml:"senderPasswd"`
Receivers SReceivers `xml:"receivers"` // 讀取receivers標簽下的內(nèi)容,以結(jié)構(gòu)方式獲取
}
type SReceivers struct {
Flag string `xml:"flag,attr"` // 讀取flag屬性
User []string `xml:"user"` // 讀取user數(shù)組
}
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)
}
}
運行效果:
[root@local t1]# ls
default.xml xmlCnfTest1.go
[root@local t1]# go run xmlCnfTest1.go
{{ config} smtp.163.com 25 user@163.com 123456 {true [Mike_Zhang@live.com test1@qq.com]}}
SmtpServer : smtp.163.com
SmtpPort : 25
Sender : user@163.com
SenderPasswd : 123456
Receivers.Flag : true
Mike_Zhang@live.com
test1@qq.com
[root@local t1]#
討論
如果需要直接從字符串解析xml配置,可將如下語句中的data替換即可:
err = xml.Unmarshal(data, v)
比如:
err = xml.Unmarshal([]byte(ConfigContent), v) // ConfigContent為xml字符串
好,就這些了,希望對你有幫助。
以上這篇使用go語言解析xml的實現(xiàn)方法(必看篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。