欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用go语言解析xml的实现方法(必看篇)

程序员文章站 2022-03-20 16:37:15
操作系统: centos 6.9_x64 go语言版本: 1.8.3 问题描述 现有一个自动报障程序,如果服务出错会自动给指定人发送邮件,配置文件内容如下(defau...

操作系统: 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
mike_zhang@live.com
test1@qq.com
[root@local t1]#

讨论

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

err = xml.unmarshal(data, &v)

比如:

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

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

以上这篇使用go语言解析xml的实现方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。