使用go语言解析xml的实现方法(必看篇)
操作系统:CentOS6.9_x64
go语言版本:1.8.3
问题描述
现有一个自动报障程序,如果服务出错会自动给指定人发送邮件,配置文件内容如下(default.xml):
smtp.163.com 25 user@163.com 123456 Mike_Zhang@live.com test1@qq.com
该配置以config为root标签,有xmltext部分(比如smtpServer标签)、嵌套xml(receivers标签)、有xmlattribute部分(receivers标签的flag)、类似数组的多行配置(user标签),数据类型有字符串和数字两种类型。
解决方案
packagemain import( "encoding/xml" "fmt" "io/ioutil" "os" ) typeSConfigstruct{ XMLNamexml.Name`xml:"config"`//指定最外层的标签为config SmtpServerstring`xml:"smtpServer"`//读取smtpServer配置项,并将结果保存到SmtpServer变量中 SmtpPortint`xml:"smtpPort"` Senderstring`xml:"sender"` SenderPasswdstring`xml:"senderPasswd"` ReceiversSReceivers`xml:"receivers"`//读取receivers标签下的内容,以结构方式获取 } typeSReceiversstruct{ Flagstring`xml:"flag,attr"`//读取flag属性 User[]string`xml:"user"`//读取user数组 } funcmain(){ file,err:=os.Open("default.xml")//Forreadaccess. iferr!=nil{ fmt.Printf("error:%v",err) return } deferfile.Close() data,err:=ioutil.ReadAll(file) iferr!=nil{ fmt.Printf("error:%v",err) return } v:=SConfig{} err=xml.Unmarshal(data,&v) iferr!=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) fori,element:=rangev.Receivers.User{ fmt.Println(i,element) } }
运行效果:
[root@localt1]#ls default.xmlxmlCnfTest1.go [root@localt1]#gorunxmlCnfTest1.go {{config}smtp.163.com25user@163.com123456{true[Mike_Zhang@live.comtest1@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@localt1]#
讨论
如果需要直接从字符串解析xml配置,可将如下语句中的data替换即可:
err=xml.Unmarshal(data,&v)
比如:
err=xml.Unmarshal([]byte(ConfigContent),&v)//ConfigContent为xml字符串
好,就这些了,希望对你有帮助。
以上这篇使用go语言解析xml的实现方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。