使用go语言解析xml

栏目: Go · 发布时间: 6年前

内容简介:使用go语言解析xml

操作系统: 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>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标签,有xml text部分(比如smtpServer标签)、嵌套xml(receivers标签)、有xml attribute部分(receivers标签的flag)、类似数组的多行配置(user标签), 数据类型有字符串和数字两种类型。

解决方案

package main

import (
    "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]# 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
0 Mike_Zhang@live.com
1 test1@qq.com
[root@local t1]#

讨论

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

err = xml.Unmarshal(data, &v)

比如:

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

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

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/ 20170610_使用 go 解析xml.rst

欢迎补充


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新

创新

理查德·福斯特 / 王宇锋 / 中信出版社 / 2008-10 / 32.00元

《创新:进攻者的优势》内容简介:为什么一流企业突然间将它们的市场拱手让与新的竞争者?要避免这样的命运,需要无情地抛弃那些过去使它们成功的技能和产品,那么究竟哪些企业能够做到这一点呢?企业如果总是墨守成规、因循守旧,那么长期下去,必然无法以市场的速度及规模进行革新或创造价值。这样的企业会像得州仪器、施乐等市场领先者一样,被一些资源较少、技术较差、市场支配力较弱的竞争对手超越,而这些所谓进攻者的优势,......一起来看看 《创新》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具