使用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的实现方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。