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的更多相关文章

  1. Golang 入门 : 结构体(struct)

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...

  2. 将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. ...

  3. golang 兼容不同json结构体解析实践

    线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单 ...

  4. Objective-C中将结构体与联合体封装为NSValue对象

    在Clang 3.7之前,Objective-C已经可以使用类似@100.@YES.@10.5f等字面量表示一个NSNumber对象:用类似@"xxx"的字面量表示一个NSStri ...

  5. Golang操作结构体、Map转化为JSON

    结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...

  6. golang初始化结构体数组

    最近组里新项目要求用go来写,没办法只能边看文档边写代码,今天遇到郁闷的问题,查了好久最终发现居然是一个标点符号的导致的,遂纪录之 刚刚给一个接口写单元测试时想初始化一个结构体数组,然后遍历该数组并建 ...

  7. golang之结构体使用注意事项和细节

    1. 结构体的所有字段在内在中是连续的 2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字.个数和类型) 3. 结构体进行type重新定义(相当于取别名),Golang认 ...

  8. golang(07)结构体介绍

    golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...

  9. file_operations结构体解析 1

    注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看 ...

随机推荐

  1. 【敏杰开发】Beta阶段项目展示

    [敏杰开发]Beta阶段项目展示 项目相关地址汇总 线上地址:http://roadmap.imcoming.top 前端仓库:https://github.com/MinJieDev/Roadmap ...

  2. OCR-Form-Tools项目试玩记录(一)本地部署

    OCR-Form-Tools是微软的一个开源代码库,包含微软表单识别和OCR服务相关的多种工具.Github仓库地址 目前,表单标注工具(OCR Form Labeling Tool)是首个发布到本该 ...

  3. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  4. redis分布式锁-可重入锁

    redis分布式锁-可重入锁 上篇redis实现的分布式锁,有一个问题,它不可重入. 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞. 同一个 ...

  5. Rsync忽略文件夹或目录

    使用Rsync同步的时候往往会要求对某个文件夹或者文件进行忽略,客户端可以使用--exclude参数来实现对,目录或者文件的忽略 rsync -rltvz --port=873 --exclude & ...

  6. Mysql不知道默认密码情况下登录/重置/忘记密码

    场景一: 基础系统:linux 镜像:LAMP环境(Ubuntu 18.04 Apache PHP7.0) 问题:ERROR 1405 (28000): Access denied for user ...

  7. Spring-Cloud之Feign原理剖析

    Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于rib ...

  8. GO学习-(14) Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  9. 在命令行模式下查看Python帮助文档---dir、help、__doc__

    在命令行模式下查看Python帮助文档---dir.help.__doc__   1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  10. node.js学习(5)读写文件(同步异步)

    1 导入文件系统库 # 同步的 读文件 写文件 # 异步 需要用异步处理耗时