您好,登錄后才能下訂單哦!
go語言中怎么解析xml,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
問題描述
現(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標(biāo)簽,有xml text部分(比如smtpServer標(biāo)簽)、嵌套xml(receivers標(biāo)簽)、有xml attribute部分(receivers標(biāo)簽的flag)、類似數(shù)組的多行配置(user標(biāo)簽), 數(shù)據(jù)類型有字符串和數(shù)字兩種類型。
解決方案
package main import ( "encoding/xml" "fmt" "io/ioutil" "os" ) type SConfig struct { XMLName xml.Name `xml:"config"` // 指定最外層的標(biāo)簽為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標(biāo)簽下的內(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字符串
看完上述內(nèi)容,你們掌握go語言中怎么解析xml的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。