前言

XML是指可扩展标记语言(eXtensible MarkupLanguage),它是一种标记语言。它被设计的宗旨是描述数据(XML),而非显示数据(HTML)。

在日常开发中是比较流行的传输和存储数据结构。

Go语言中,我们用xml包的Unmarshal来解析XML文档,MarshalIndent来生成XML文档。

XML文档实例

<?xml version="1.0" encoding="utf-8"?>
<devices version="1"><device><deviceName>智能摄像头</deviceName><deviceCode>100000000001</deviceCode><deviceDate>2020-03-01</deviceDate></device><device><deviceName>智能挖掘机</deviceName><deviceCode>200000000001</deviceCode><deviceDate>2020-03-01</deviceDate></device>
</devices>

定义结构

type Device struct {XMLName     xml.Name     `xml:"devices"`Version     string       `xml:"version,attr"`Device      []DeviceNode `xml:"device"`Description string       `xml:",innerxml"`
}type DeviceNode struct {XMLName    xml.Name `xml:"device"`DeviceName string   `xml:"deviceName"`DeviceCode string   `xml:"deviceCode"`DeviceDate string   `xml:"deviceDate"`
}

Tag解释

  • "-",字段不会输出
  • "name,attr",以name作为属性名,字段值作为输出这个XML元素的属性
  • ",attr",以这个结构体struct的字段名作为属性名输出XML元素的属性,name默认是字段名
  • ",chardata",输出XML元素为character data而非element。
  • ",innerxml",原样输出,不进行常规的编码过程
  • ",comment",作为XML注释来输出,不进行编码过程,字段中不能有“--”字符串
  • "omitempty",若字段值为空、那么字段不会被输出到XML,空值有:false、0、nil指针,nil接口,任意长度为0的Slice、数组结构、Map结构或者string

生成XML

 var o = Device{}o.Device = append(o.Device, DeviceNode{DeviceName: "电脑",DeviceCode: "300000000001",DeviceDate: "2020-01-01",})o.Device = append(o.Device, DeviceNode{DeviceName: "游戏机",DeviceCode: "400000000001",DeviceDate: "2020-01-02",})o.Device = append(o.Device, DeviceNode{DeviceName: "苹果手机",DeviceCode: "500000000001",DeviceDate: "2020-01-03",})resXML, err := xml.MarshalIndent(o, " ", " ")if err != nil {fmt.Printf("marshal xml err :%v\n", err)return}_, _ = os.Stdout.Write([]byte(xml.Header))_, _ = os.Stdout.Write(resXML)

解析XML

 file := "./device.xml"fd, err := os.Open(file)if err != nil {fmt.Printf("open file err : %v\n", err)return}defer fd.Close()fileContent, err := ioutil.ReadAll(fd)if err != nil {fmt.Printf("read file err : %v\n", err)return}var device = Device{}err = xml.Unmarshal(fileContent, &device)if err != nil {fmt.Printf("unmarshal err : %v\n", err)return}for idx, node := range device.Device {fmt.Printf("序号:[%d],设备名:[%s],设备编码:[%s],设备日期:[%s]\n",idx, node.DeviceName, node.DeviceCode, node.DeviceDate)}

运行结果

Go语言 XML生成和解析相关推荐

  1. python中documentelement_python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)...

    xml.dom篇 DOM是Document Object Model的简称,XML 文档的高级树型表示.该模型并非只针对 Python,而是一种普通XML 模型.Python 的 DOM 包是基于 S ...

  2. Xml 格式数据的生成和解析

    相关阅读 XML约束 Xml 格式数据的生成和解析 XML解析器 什么是XML XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记 ...

  3. XML与JSON的生成与解析

    1. XML 1.1 XML简介 可标记语言(extensible Markup Language) 特性: XML具有平台无关性,是一门独立的语言 XML具有自我描述性 XML功能: 网络传输文件 ...

  4. c语言xml解析器libxm2

    写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言:2)LIBXML2库 ...

  5. Java自定义生成与解析(Dom4J)XML文件

    XML(Extensible Markup Language):可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 应用:XML 应用于 web 开发的许多方面, ...

  6. java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)

    GeoServer上的WCS服务发布调用及解析生成可下载为Tif的WCSUrl 2022.2.14 所用软件环境(Java.Tomcat.GeoServer.Google Browser.Eclips ...

  7. boost::spirit模块实现一个类似于 XML 的小型解析器,Karma 用于打印生成的 AST

    boost::spirit模块实现一个类似于 XML 的小型解析器,Karma 用于打印生成的 AST 实现功能 C++实现代码 实现功能 boost::spirit模块实现一个类似于 XML 的小型 ...

  8. wxml报错原因_C#生成、解析xml文件以及处理报错原因

    转载自:http://blog.csdn.net/lilinoscar/article/details/21027319 简单的介绍一下生成XML文件以及解析,因为有些数据不一定放到数据库,减少链接数 ...

  9. 大杂烩 -- 四种生成和解析XML文档的方法详解

    基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...

最新文章

  1. 和日本萌妹一起读深度学习最新论文,阅读难度会降低吗?
  2. spark里的hbase的ImmutableBytesWritable的打印问题scala
  3. python对excel增删改查_Python之Excel 优雅操作手法 精选
  4. 前端学习(3339):ant design中加上icon图标
  5. strict standards php报错,Bigcommerce:PHP版本升级错误解决办法_PHP教程
  6. Helm 3 完整教程(十一):Helm 函数讲解(5)日期函数
  7. 关键字nullable,nonnull,null_resettable,_Null_unspecified详解
  8. POJ_2258 The settlers of Catan (DFS)
  9. hadoop 2.7.3 源码编译教程
  10. Linux nvme驱动分析之用户态接口
  11. 常用的做网站软件、网站制作软件分享
  12. Kindle wifi 连接不上的问题
  13. 思科路由器的双出口nat研究
  14. Revo RS5025005C00000
  15. 锐龙r3 4100核显 r3 4100参数 r3 4100评测
  16. 栈帧详解ebp、esp
  17. 自然语言处理:问答语料生成词汇表,词转向量(三)
  18. 解剖学坐标体系(LPS , RAS和LAS)
  19. 小酷智慧地图3D导览v1.0.82 打卡定位 地图打卡
  20. 熊猫烧香病毒背后,网络高手对决一个月

热门文章

  1. web项目怎么连接云服务器,web项目怎么连接云服务器
  2. html所有页面根的对象,在django中显示来自所有用户的对象,无需登录到html页面...
  3. 谷歌Android无障碍套件,谷歌为无障碍套件添加盲文键盘:无需额外硬件就能打字...
  4. 编写python程序、创建名为class的数据库_Python中的元类(metaclass)以及元类实现单例模式...
  5. php遍历中记录所有,php遍历类中包含的所有元素的方法
  6. C#Winform调用wsdl接口webservice#http
  7. 消费流程图_SpringBoot+RabbitMQ ,保证消息100%投递成功并被消费(附源码)
  8. android开发环境教案,01. Android开发环境教案.pdf
  9. JAVA异步爬虫_Java 爬虫遇上数据异步加载,试试这两种办法!
  10. JVM插桩之四:Java动态代理机制的对比(JDK和CGLIB,Javassist,ASM)