使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)
操作系統(tǒng): CentOS 6.9_x64
go語(yǔ)言版本: 1.8.3
問(wèn)題描述
現(xiàn)有一個(gè)自動(dòng)報(bào)障程序,如果服務(wù)出錯(cuò)會(huì)自動(dòng)給指定人發(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配置項(xiàng),并將結(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)
}
}
運(yùn)行效果:
[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配置,可將如下語(yǔ)句中的data替換即可:
err = xml.Unmarshal(data, &v)
比如:
err = xml.Unmarshal([]byte(ConfigContent), &v) // ConfigContent為xml字符串
好,就這些了,希望對(duì)你有幫助。
以上這篇使用go語(yǔ)言解析xml的實(shí)現(xiàn)方法(必看篇)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
GoLang BoltDB數(shù)據(jù)庫(kù)詳解
這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫(kù),boltdb是使用Go語(yǔ)言編寫(xiě)的開(kāi)源的鍵值對(duì)數(shù)據(jù)庫(kù),boltdb存儲(chǔ)數(shù)據(jù)時(shí) key和value都要求是字節(jié)數(shù)據(jù),此處需要使用到 序列化和反序列化2023-02-02
Go?語(yǔ)言數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)抄一個(gè)list示例詳解
這篇文章主要為大家介紹了Go?語(yǔ)言數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)抄一個(gè)list示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解
這篇文章主要為大家介紹了Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
在ubuntu下構(gòu)建go語(yǔ)言開(kāi)發(fā)環(huán)境的方法
這篇文章主要介紹了在ubuntu下構(gòu)建go語(yǔ)言開(kāi)發(fā)環(huán)境的方法,需要的朋友可以參考下2014-10-10
Go語(yǔ)言入門教程之基礎(chǔ)語(yǔ)法快速入門
這篇文章主要介紹了Go語(yǔ)言入門教程之基礎(chǔ)語(yǔ)法快速入門,本文講解了值類型、變量、常量、循環(huán)、條件語(yǔ)句、條件枚舉等內(nèi)容,需要的朋友可以參考下2014-11-11
go實(shí)現(xiàn)Redis讀寫(xiě)分離示例詳解
本篇文章將介紹Redis通信協(xié)議RESP,?而后在使用go來(lái)編寫(xiě)一個(gè)中間件,從而來(lái)完成Redis讀寫(xiě)分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
淺談Go中數(shù)字轉(zhuǎn)換字符串的正確姿勢(shì)
這篇文章主要介紹了淺談Go中數(shù)字轉(zhuǎn)換字符串的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

