博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用go语言解析xml
阅读量:6151 次
发布时间:2019-06-21

本文共 2266 字,大约阅读时间需要 7 分钟。

操作系统: CentOS 6.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标签,有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 user@163.com 123456 {
true [Mike_Zhang@live.com test1@qq.com]}}SmtpServer : smtp.163.comSmtpPort : 25Sender : user@163.comSenderPasswd : 123456Receivers.Flag : true0 Mike_Zhang@live.com1 test1@qq.com[root@local t1]#

讨论

如果需要直接从字符串解析xml配置,可将如下语句中的data替换即可:

err = xml.Unmarshal(data, &v)

比如:

err = xml.Unmarshal([]byte(ConfigContent), &v) // ConfigContent为xml字符串

好,就这些了,希望对你有帮助。

本文github地址:

欢迎补充 

转载地址:http://tnwfa.baihongyu.com/

你可能感兴趣的文章
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>
Linux下ftp和ssh详解
查看>>
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
查看>>
js时间和时间戳之间如何转换(汇总)
查看>>
js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用
查看>>
java中string和int的相互转换
查看>>
P1666 前缀单词
查看>>
HTML.2文本
查看>>
Ubuntu unity安装Indicator-Multiload
查看>>
解决Eclipse中新建jsp文件ISO8859-1 编码问题
查看>>
7.对象创建型模式-总结
查看>>
1、块:ion-item
查看>>
【论文阅读】Classification of breast cancer histology images using transfer learning
查看>>