操作系统: CentOS 6.9_x64

go语言版本: 1.8.3

问题描述

现有一个自动报障程序,如果服务出错会自动给指定人发送邮件,配置文件内容如下(default.xml):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3. <smtpServer>smtp.163.com</smtpServer>
  4. <smtpPort>25</smtpPort>
  5. <sender>user@163.com</sender>
  6. <senderPasswd>123456</senderPasswd>
  7. <receivers flag="true">
  8. <user>Mike_Zhang@live.com</user>
  9. <user>test1@qq.com</user>
  10. </receivers>
  11. </config>

该配置以config为root标签,有xml text部分(比如smtpServer标签)、嵌套xml(receivers标签)、有xml attribute部分(receivers标签的flag)、类似数组的多行配置(user标签), 数据类型有字符串和数字两种类型。

解决方案

  1. package main
  2.  
  3. import (
  4. "encoding/xml"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. )
  9.  
  10. type SConfig struct {
  11. XMLName xml.Name `xml:"config"` // 指定最外层的标签为config
  12. SmtpServer string `xml:"smtpServer"` // 读取smtpServer配置项,并将结果保存到SmtpServer变量中
  13. SmtpPort int `xml:"smtpPort"`
  14. Sender string `xml:"sender"`
  15. SenderPasswd string `xml:"senderPasswd"`
  16. Receivers SReceivers `xml:"receivers"` // 读取receivers标签下的内容,以结构方式获取
  17. }
  18.  
  19. type SReceivers struct {
  20. Flag string `xml:"flag,attr"` // 读取flag属性
  21. User []string `xml:"user"` // 读取user数组
  22. }
  23.  
  24. func main() {
  25. file, err := os.Open("default.xml") // For read access.
  26. if err != nil {
  27. fmt.Printf("error: %v", err)
  28. return
  29. }
  30. defer file.Close()
  31. data, err := ioutil.ReadAll(file)
  32. if err != nil {
  33. fmt.Printf("error: %v", err)
  34. return
  35. }
  36. v := SConfig{}
  37. err = xml.Unmarshal(data, &v)
  38. if err != nil {
  39. fmt.Printf("error: %v", err)
  40. return
  41. }
  42.  
  43. fmt.Println(v)
  44. fmt.Println("SmtpServer : ",v.SmtpServer)
  45. fmt.Println("SmtpPort : ",v.SmtpPort)
  46. fmt.Println("Sender : ",v.Sender)
  47. fmt.Println("SenderPasswd : ",v.SenderPasswd)
  48. fmt.Println("Receivers.Flag : ",v.Receivers.Flag)
  49. for i,element := range v.Receivers.User {
  50. fmt.Println(i,element)
  51. }
  52. }

运行效果:

  1. [root@local t1]# ls
  2. default.xml xmlCnfTest1.go
  3. [root@local t1]# go run xmlCnfTest1.go
  4. {{ config} smtp..com user@.com {true [Mike_Zhang@live.com test1@qq.com]}}
  5. SmtpServer : smtp..com
  6. SmtpPort :
  7. Sender : user@.com
  8. SenderPasswd :
  9. Receivers.Flag : true
  10. Mike_Zhang@live.com
  11. test1@qq.com
  12. [root@local t1]#

讨论

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

  1. err = xml.Unmarshal(data, &v)

比如:

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

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

本文github地址:

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

欢迎补充

使用go语言解析xml的更多相关文章

  1. 工作日志2014-06-10(实现C语言解析XML获得查询关键字)

    #include "GetInfo.h" ]; int GetInfoToWrite(char* path, char* domain,Write_t* pwrite); int ...

  2. Qt中三种解析xml的方式

    在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...

  3. python3 解析xml

    转载:http://www.jb51.net/article/79494.htm 这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方 ...

  4. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  5. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  6. Javaweb学习笔记——使用Jdom解析xml

    一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...

  7. Strus2第一次课:dom4j解析xml文档

    xml文本标记语言: 常用于交换数据:独立于操作系统.编程语言数据存储:xml数据配置:灵活性强,可读性高可以使用css样式改变xml样式 xml解析技术:dom解析xml技术: sax解析xml技术 ...

  8. iOS-数据解析XML解析的多种平台介绍

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...

  9. Android使用SAX解析XML(1)

    可扩展标记语言XML是一种数据交换格式,允许用户自己定义,适合Web传输,能提供独立于程序的数据.XML在Android中也有广泛的应用,Android解析XML的方法有很多,本文介绍使用SAX(Si ...

随机推荐

  1. transitionFromView方法的使用

    transitionFromView方法的使用 效果 源码 // // ViewController.m // TransitionFromView // // Created by YouXianM ...

  2. Android性能检测工具——traceview

    之前的几篇文章中介绍了android中常用的一些工具,今天介绍的工具也是比较实用和方便的,它可以用量化的指标告诉我们哪个方法执行的时间最长,被调用的次数最多,有没有重复调用.下面我们就来看看它是怎么为 ...

  3. 【.Net】 C#访问修饰符

    一 类的修饰符:  C#中类的默认修饰符是internal.1 private 只有对包.NET中的应用程序或库才能访问.2 public 不限制对类的访问. 3 protected 只可以被本类和其 ...

  4. ASP.NET C#根据HTML页面导出PDF

    在启明星采购系统里,新增了导出PDF功能.整个功能使用了第三方软件 wkhtmltopdf(下载) 官网 https://wkhtmltopdf.org/ 提供有更多版本下载 他可以把HTML页面转换 ...

  5. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  6. Nutch1.7学习笔记:基本环境搭建及使用

    Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...

  7. C# 遍历文件夹非递归实现(采用队列的广度优先算法)(转)

    一.实现思路: 1. 创建一个队列(使用C# 队列类 Queue,需要使用命名空间 System.Collections.Generic): 2. 把起始文件夹名称排入队中: 3. 检查队列中是否有文 ...

  8. [leetcode]Merge Sorted Array @ Python

    原题地址:https://oj.leetcode.com/problems/merge-sorted-array/ 题意:Given two sorted integer arrays A and B ...

  9. 【Spark】SparkStreaming-CPU资源设置的蹊跷

    SparkStreaming-CPU资源设置的蹊跷. Spark streaming network_wordcount.py does not print result - Stack Overfl ...

  10. 文本分类(六):使用fastText对文本进行分类--小插曲

    http://blog.csdn.net/lxg0807/article/details/52960072 环境说明:python2.7.linux 自己打自己脸,目前官方的包只能在linux,mac ...