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

发布时间 - 2026-01-11 01:49:24    点击率:

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


# go语言解析xml  # Go语言实现对XML的读取和修改  # go语言处理JSON和XML数据示例解析  # Go语言中XML文件的读写操作  # Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结  # 从入门到精通:Go语言XML数据解析指南  # 给大家  # 你有  # 希望能  # 并将  # 这篇  # 可将  # 必看  # 小编  # 配置文件  # 大家多多  # 人发  # 两种类型  # 操作系统  # 最外层  # sender  # user  # senderPasswd  # smtpPort  # config  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Linux后台任务运行方法_nohup与&使用技巧【技巧】  郑州企业网站制作公司,郑州招聘网站有哪些?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  C#如何调用原生C++ COM对象详解  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Bootstrap整体框架之JavaScript插件架构  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel如何记录自定义日志?(Log频道配置)  制作旅游网站html,怎样注册旅游网站?  活动邀请函制作网站有哪些,活动邀请函文案?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  如何快速生成凡客建站的专业级图册?  Laravel怎么使用artisan命令缓存配置和视图  MySQL查询结果复制到新表的方法(更新、插入)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  bing浏览器学术搜索入口_bing学术文献检索地址  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Python文件异常处理策略_健壮性说明【指导】  EditPlus中的正则表达式实战(5)  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何快速上传建站程序避免常见错误?  EditPlus中的正则表达式 实战(2)  Firefox Developer Edition开发者版本入口  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何打造高效商业网站?建站目的决定转化率  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  香港服务器租用每月最低只需15元?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  详解jQuery停止动画——stop()方法的使用  如何用美橙互联一键搭建多站合一网站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  高端智能建站公司优选:品牌定制与SEO优化一站式服务  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Android自定义控件实现温度旋转按钮效果  linux top下的 minerd 木马清除方法  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在IIS7上新建站点并设置安全权限?