使用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..com user@.com {true [Mike_Zhang@live.com test1@qq.com]}}
- SmtpServer : smtp..com
- SmtpPort :
- Sender : user@.com
- SenderPasswd :
- 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字符串
好,就这些了,希望对你有帮助。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170610_使用go解析xml.rst
欢迎补充
使用go语言解析xml的更多相关文章
- 工作日志2014-06-10(实现C语言解析XML获得查询关键字)
#include "GetInfo.h" ]; int GetInfoToWrite(char* path, char* domain,Write_t* pwrite); int ...
- Qt中三种解析xml的方式
在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...
- python3 解析xml
转载:http://www.jb51.net/article/79494.htm 这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方 ...
- Android之解析XML
1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...
- 用 ElementTree 在 Python 中解析 XML
用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...
- Javaweb学习笔记——使用Jdom解析xml
一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...
- Strus2第一次课:dom4j解析xml文档
xml文本标记语言: 常用于交换数据:独立于操作系统.编程语言数据存储:xml数据配置:灵活性强,可读性高可以使用css样式改变xml样式 xml解析技术:dom解析xml技术: sax解析xml技术 ...
- iOS-数据解析XML解析的多种平台介绍
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
- Android使用SAX解析XML(1)
可扩展标记语言XML是一种数据交换格式,允许用户自己定义,适合Web传输,能提供独立于程序的数据.XML在Android中也有广泛的应用,Android解析XML的方法有很多,本文介绍使用SAX(Si ...
随机推荐
- transitionFromView方法的使用
transitionFromView方法的使用 效果 源码 // // ViewController.m // TransitionFromView // // Created by YouXianM ...
- Android性能检测工具——traceview
之前的几篇文章中介绍了android中常用的一些工具,今天介绍的工具也是比较实用和方便的,它可以用量化的指标告诉我们哪个方法执行的时间最长,被调用的次数最多,有没有重复调用.下面我们就来看看它是怎么为 ...
- 【.Net】 C#访问修饰符
一 类的修饰符: C#中类的默认修饰符是internal.1 private 只有对包.NET中的应用程序或库才能访问.2 public 不限制对类的访问. 3 protected 只可以被本类和其 ...
- ASP.NET C#根据HTML页面导出PDF
在启明星采购系统里,新增了导出PDF功能.整个功能使用了第三方软件 wkhtmltopdf(下载) 官网 https://wkhtmltopdf.org/ 提供有更多版本下载 他可以把HTML页面转换 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- Nutch1.7学习笔记:基本环境搭建及使用
Nutch1.7学习笔记:基本环境搭建及使用 作者:雨水,时间:2013-10-31博客地址:http://blog.csdn.net/gobitan 说明:Nutch有两个主版本1.x和2.x,它们 ...
- C# 遍历文件夹非递归实现(采用队列的广度优先算法)(转)
一.实现思路: 1. 创建一个队列(使用C# 队列类 Queue,需要使用命名空间 System.Collections.Generic): 2. 把起始文件夹名称排入队中: 3. 检查队列中是否有文 ...
- [leetcode]Merge Sorted Array @ Python
原题地址:https://oj.leetcode.com/problems/merge-sorted-array/ 题意:Given two sorted integer arrays A and B ...
- 【Spark】SparkStreaming-CPU资源设置的蹊跷
SparkStreaming-CPU资源设置的蹊跷. Spark streaming network_wordcount.py does not print result - Stack Overfl ...
- 文本分类(六):使用fastText对文本进行分类--小插曲
http://blog.csdn.net/lxg0807/article/details/52960072 环境说明:python2.7.linux 自己打自己脸,目前官方的包只能在linux,mac ...