Golang通过结构体解析和封装XML
Golang解析和封装XML
解析XML成结构体Demo
package main
import (
"encoding/xml"
"fmt"
)
//我们通过定义一个结构体,来解析xml
//注意,结构体中的字段必须是可导出的
type Books struct {
//如果有类型为xml.Name的XMLName字段,则解析时会保存元素名到该字段
XMLName xml.Name `xml:"books"`
//定义的字段中包含,attr,则解析时会把对应字段的属性值赋给该字段
Nums int `xml:"nums,attr"`
//定义的字段名含有xml中元素名,则解析时会把该元素值赋给该字段
Book []Book `xml:"book"`
//字段类型为string或[]byte,并且包含,innerxml,则解析时会把此字段对应的元素内所有原始xml累加到字段上
//Data string `xml:",innerxml"`
//字段定义包含-,则解析时不会为该字段匹配任何数据
//Tmp int `xml:"-"`
}
type Book struct {
XMLName xml.Name `xml:"book"`
Name string `xml:"name,attr"`
Author string `xml:"author"`
Time string `xml:"time"`
//字段定义如a>b>c,这样,解析时会从xml当前节点向下寻找元素并将值赋给该字段
Types []string `xml:"types>type"`
//字段定义有,any,则解析时如果xml元素没有与任何字段匹配,那么这个元素就会映射到该字段
Test string `xml:",any"`
}
func main() {
//xml数据字符串
data := `<?xml version="1.0" encoding="utf-8"?>
<books nums="2">
<book name="思想">
<author>小张</author>
<time>2018年1月20日</time>
<types>
<type>教育</type>
<type>历史</type>
</types>
<test>我是多余的</test>
</book>
<book name="政治">
<author>小王</author>
<time>2018年1月20日</time>
<types>
<type>科学</type>
<type>人文</type>
</types>
<test>我是多余的</test>
</book>
</books>`
//创建一个Books对象
bs := Books{}
//把xml数据解析成bs对象
xml.Unmarshal([]byte(data), &bs)
//打印bs对象
fmt.Printf("%+v \n",bs)
//循环打印Book
for _, v := range bs.Book {
fmt.Printf("%+v \n",v)
}
}
输出
{XMLName:{Space: Local:books} Nums:2 Book:[{XMLName:{Space: Local:book} Name:思想 Author:小张 Time:2018年1月20日 Types:[教育 历史] Test:我是多余的} {XMLName:{Space: Local:book} Name:政治 Author:小王 Time:2018年1月20日 Types:[科学 人文] Test:我是多余的}]}
{XMLName:{Space: Local:book} Name:思想 Author:小张 Time:2018年1月20日 Types:[教育 历史] Test:我是多余的}
{XMLName:{Space: Local:book} Name:政治 Author:小王 Time:2018年1月20日 Types:[科学 人文] Test:我是多余的}
通过结构体封装XMLDemo
package main
import (
"encoding/xml"
"fmt"
)
type Books struct {
XMLName xml.Name `xml:"books"`
Nums int `xml:"nums,attr"`
Book []Book `xml:"book"`
}
type Book struct {
XMLName xml.Name `xml:"book"`
Name string `xml:"name,attr"`
Author string `xml:"author"`
Time string `xml:"time"`
}
func main() {
bs := Books{Nums: 2}
//通过append添加book数据
bs.Book = append(bs.Book, Book{Name: "小红", Author: "阿三", Time: "2018年6月3日"})
bs.Book = append(bs.Book, Book{Name: "小绿", Author: "阿四", Time: "2018年6月5日"})
//通过MarshalIndent,让xml数据输出好看点
data, _ := xml.MarshalIndent(&bs, "", " ")
fmt.Println(string(data))
}
输出
<books nums="2">
<book name="小红">
<author>阿三</author>
<time>2018年6月3日</time>
</book>
<book name="小绿">
<author>阿四</author>
<time>2018年6月5日</time>
</book>
</books>
Golang通过结构体解析和封装XML的更多相关文章
- Golang 入门 : 结构体(struct)
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- golang 兼容不同json结构体解析实践
线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单 ...
- Objective-C中将结构体与联合体封装为NSValue对象
在Clang 3.7之前,Objective-C已经可以使用类似@100.@YES.@10.5f等字面量表示一个NSNumber对象:用类似@"xxx"的字面量表示一个NSStri ...
- Golang操作结构体、Map转化为JSON
结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...
- golang初始化结构体数组
最近组里新项目要求用go来写,没办法只能边看文档边写代码,今天遇到郁闷的问题,查了好久最终发现居然是一个标点符号的导致的,遂纪录之 刚刚给一个接口写单元测试时想初始化一个结构体数组,然后遍历该数组并建 ...
- golang之结构体使用注意事项和细节
1. 结构体的所有字段在内在中是连续的 2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字.个数和类型) 3. 结构体进行type重新定义(相当于取别名),Golang认 ...
- golang(07)结构体介绍
golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...
- file_operations结构体解析 1
注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看 ...
随机推荐
- [BUAA2021软工助教]结对项目-第二阶段小结
一.作业链接 结对项目-第二阶段 二.优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 磨练,结对编程!(中) zzx 和 zzy 同学实 ...
- API网关才是大势所趋?SpringCloud Gateway保姆级入门教程
什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...
- Docker 部署阿里云RocketMQ 4.5.1
搜索镜像 docker search rocketmq 查看镜像版本 如果要查看其它的镜像,只需要将其中的镜像名称foxiswho/rocketmq替换为其它镜像即可 curl https://reg ...
- 普里姆算法(Prim)
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...
- Mybatis-spring-boot-starter自动配置的原理分析
相信大家在使用SpringBoot的过程中,经常会使用到mybatis,通过使用mybatis-spring-boot-starter依赖进行自动配置,省去了自己依赖配置和Bean配置的很多麻烦. 有 ...
- [Java] javaEE
定义 面向企业级应用中一些通用模块制定的标准 避免重复开发,解决代码可靠性问题 13种规范 JDBC(JavaDatabase Connectivity):数据库连接 以统一方式访问数据库的API J ...
- stressapptest测试用例testcase方法aarch64
### https://github.com/stressapptest/stressapptest aarch64 To build from source, the build/installat ...
- linux服务之NTP及chrony时间同步
博客园 首页 联系 管理 linux服务之NTP及chrony时间同步 一.NTP时间同步 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步 ...
- U盘PE重装系统导致D、E、F盘消失
U盘PE重装系统导致D.E.F盘消失 听语音 原创 | 浏览:1251 | 更新:2014-08-18 18:46 | 标签:u盘 重装 解决使用U盘PE重装系统导致的错误问题 工具/原料 制作好 ...
- 强哥MySQL学习笔记
数据库服务器:1.数据库2.数据表 数据表:1.表结构(字段)2.表数据(记录)3.表索引(加快检索) 表引擎:1.myisam2.innodb 查看表字段desc table;删除数据库:drop ...