使用go语言解析xml的实现方法(必看篇)
Go  /  管理员 发布于 4年前   294
操作系统: CentOS 6.9_x64
go语言版本: 1.8.3
问题描述
现有一个自动报障程序,如果服务出错会自动给指定人发送邮件,配置文件内容如下(default.xml):
<?xml version="1.0" encoding="UTF-8"?><config> <smtpServer>smtp.163.com</smtpServer> <smtpPort>25</smtpPort> <sender>[email protected]</sender> <senderPasswd>123456</senderPasswd> <receivers flag="true"> <user>[email protected]</user> <user>[email protected]</user> </receivers></config>
该配置以config为root标签,有xml text部分(比如smtpServer标签)、嵌套xml(receivers标签)、有xml attribute部分(receivers标签的flag)、类似数组的多行配置(user标签), 数据类型有字符串和数字两种类型。
解决方案
package mainimport ( "encoding/xml" "fmt" "io/ioutil" "os")type SConfig struct { XMLName xml.Name `xml:"config"` // 指定最外层的标签为config SmtpServer string `xml:"smtpServer"` // 读取smtpServer配置项,并将结果保存到SmtpServer变量中 SmtpPort int `xml:"smtpPort"` Sender string `xml:"sender"` SenderPasswd string `xml:"senderPasswd"` Receivers SReceivers `xml:"receivers"` // 读取receivers标签下的内容,以结构方式获取}type SReceivers struct { Flag string `xml:"flag,attr"` // 读取flag属性 User []string `xml:"user"` // 读取user数组}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]# lsdefault.xml xmlCnfTest1.go[root@local t1]# go run xmlCnfTest1.go{{ config} smtp.163.com 25 [email protected] 123456 {true [[email protected] [email protected]]}}SmtpServer : smtp.163.comSmtpPort : 25Sender : [email protected] : 123456Receivers.Flag : [email protected]@qq.com[root@local t1]#
讨论
如果需要直接从字符串解析xml配置,可将如下语句中的data替换即可:
err = xml.Unmarshal(data, &v)
比如:
err = xml.Unmarshal([]byte(ConfigContent), &v) // ConfigContent为xml字符串
好,就这些了,希望对你有帮助。
以上这篇使用go语言解析xml的实现方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号