一、简介

xml是一种进行数据交换和信息传递的一种格式,在web后端开发使用非常普遍,下面介绍go语言解析xml的方法。

二、代码

1.将xml解析为对象

<Person><FullName>Grace R. Emlin</FullName><Company>Example Inc.</Company><Email where="home"><Addr>gre@example.com</Addr></Email><Email where='work'><Addr>gre@work.com</Addr></Email><Group><Value>Friends</Value><Value>Squash</Value></Group><City>Hanga Roa</City><State>Easter Island</State>
</Person>

使用xml的Unmarshal进行自动解析

import ("encoding/xml""fmt"
)type Email struct {Where string `xml:"where,attr"`Addr  string}type Address struct {City, State string}type Result struct {// XMLName xml.Name `xml:"Person"`Name   string `xml:"FullName"`Phone  stringEmail  []EmailGroups []string `xml:"Group>Value"`Address}type Root struct {XMLName xml.Name `xml:"root"`Res     Result   `xml:"Person"`}v := Result{Name: "none", Phone: "none"}data := `<Person><FullName>Grace R. Emlin</FullName><Company>Example Inc.</Company><Email where="home"><Addr>gre@example.com</Addr></Email><Email where='work'><Addr>gre@work.com</Addr></Email><Group><Value>Friends</Value><Value>Squash</Value></Group><City>Hanga Roa</City><State>Easter Island</State></Person>`err := xml.Unmarshal([]byte(data), &v)if err != nil {fmt.Printf("error: %v", err)return}// fmt.Printf("XMLName: %#v\n", v.XMLName)fmt.Printf("Name: %q\n", v.Name)fmt.Printf("Phone: %q\n", v.Phone)fmt.Printf("Email: %v\n", v.Email)fmt.Printf("Groups: %v\n", v.Groups)fmt.Printf("Address: %v\n", v.Address)

下面是unmarshal解析的解析规则(下面的规则是从golang的官方文档中翻译过来的):

1)如果该结构有一个类型为[]byte或string",innerxnl"的字段。Unmarshal收集该字段中元素内嵌套的原始xMI。其余的规则仍然适用。

2)如果该结构有一个类型为xml . name的名为XMLName的字段,Unnarshal记录该字段中的元素名。

3)如果XMLName字段有表单的关联标记"name" 或 “namespace-URL name”, 元素必须具有name(和 , 可选的 “name space”),否则Unnarshal返回错误。

4)如果XML元素具有一个属性,该属性的名字与struct结构体的字段名字匹配(这个字段的tag 包含",attr" 或者显示包含name “name,attr”),Unmarshal记录该字段中的属性值。

5)如果XML元素包含字符数据,该数据积累在第一个有标签“chardata”的struct字段中,该struct字段的类型可能为[]byte或string。如果没有这样的字段。字符数据被丢弃。

6)如果XML元素包含注释,它们会累积在第一个带有标签",comments"的struct字段中。struct字段的类型可以是[]byte或string。如果没有这样的字段,注释将被丢弃。

7)如果XML元素包含名称匹配的子元素标签format tag的前缀为“a”或“a>b>c”,unmarshal将进入XML结构查找具有给定名称的元素,并将最内层的元素映射到该struct字段。以“>”开头的标签相当于一个以字段名后跟“>”开头的标签。

8)如果XML元素包含一个子元素,该子元素的名称与struct字段的XMLName标签匹配,并且struct字段没有按照前面的规则显式的名称标签,unmarshal将该子元素映射到该struct字段

9)如果XML元素包含一个子元素,它的名字匹配字段中没有任何模式标记(",attr", ", chardata"等)。Unmarshal 解析子元素到该结构字段。

10)如果XML元素包含一个子元素,它不符合上面的任何规则,并且该结构有一个带",any"标签的字段unmarshal 匹配子元素到该结构字段”。

11)一个非指针匿名结构字段被当作它的值的字段是外部结构的一部分来处理。

12)带有“-”标签的struct字段永远不会被解编入。

2.将对象解析为xml,这个过程是上面过程的逆过程,不过很简单,不用担心

type Email struct {Where string `xml:"where,attr"`Addr  string}type Address struct {City, State string}type Result struct {// XMLName xml.Name `xml:"Person"`Name   string `xml:"FullName"`Phone  stringEmail  []EmailGroups []string `xml:"Group>Value"`Address}type Root struct {XMLName xml.Name `xml:"root"`Res     Result   `xml:"Person"`}r := Root{Res: Result{Name:   "爱喝水的社长",Phone:  "18888888888",Email:  []Email{Email{Where: "c1", Addr: "xxxx@163.com"}, Email{Where: "c2", Addr: "xxxx@126.com"}},Groups: []string{"group1", "group2"},Address: Address{City:  "China",State: "aaa",},},}vbyte, err := xml.Marshal(r)if err != nil {fmt.Println("marshal err", err)}fmt.Printf("%v\n", string(vbyte))

上面代码的输出结果为:

爱喝水的社长18888888888xxxx@163.comxxxx@126.comgroup1group2Chinaaaa

与1中的xml结构相同!

以上就是go的xml的解析方式!

相同的内容在下面的公众号中也同步更新,每天发布一些编程知识,有兴趣的朋友可以关注下,感谢大家支持!!

go基础:xml解析相关推荐

  1. Java基础-xml解析

    XML XML 概述 Exendsible Markup Language(XML)可扩展标记语言 用途: 数据存储,小型数据库,存在一定CRUD操作可行性 网络数据的传输 JavaWEB项目配置文件 ...

  2. Java基础加强重温_13:XML(可拓展标记语言)、XML语法、XML约束、XML解析(Dom4j,JAXP)、Dom4j基本使用、Xpath表达式(XML路径语言)、XML解析综合案例

    摘要 Java基础加强重温_13: XML(可拓展标记语言.作用:小型数据库.框架配置文件.不同平台数据交换). XML语法(文档.标签/元素.属性.注释.转义字符.CDTA区) XML约束(DTD约 ...

  3. 【零基础上手JavaWeb】07 快速上手 XML解析方法

    写在前面,大家好!我是[跨考菌],一枚跨界的程序猿,专注于后台技术的输出,目标成为全栈攻城狮!这博客是对我跨界过程的总结和思考.如果你也对Java.后端技术感兴趣,抑或是正在纠结于跨界,都可以关注我的 ...

  4. Python 爬虫笔记、多线程、xml解析、基础笔记(不定时更新)

    1  Python学习网址:http://www.runoob.com/python/python-multithreading.html     注意高级中的xml解析和多线程 2  参考笔记 虫师 ...

  5. iOS基础-数据解析方法初步总结-(XML,JSON欢迎指正)

    小时候的记忆与大家一起分享,愿君安好! 解析的基本概念 解析: 从事先规定好的格式中提取数据 解析的前提: 提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据 OS开发常见的解析 ...

  6. XML解析简介及Xerces-C++简单使用举例

    XML是由World WideWeb联盟(W3C)定义的元语言.它已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.XML在不同的语言里解析方式 ...

  7. mapper注解的主要作用_Mybatis中mapper的xml解析详解

    上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder. 基础介绍 回顾下之前是在分析config ...

  8. Java XML解析工具 JDOM介绍及使用实例

    Java XML解析工具 JDOM JDOM介绍 JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序. 它的设计包含Java语言的语法乃至语义. JDOM是一个开源项目,它基于树 ...

  9. Spring OXM- 漫谈XML解析技术

    概述 XML解析技术漫谈 认识XML XMl的处理技术 概述 我们先从XML各种解析技术的发展历程谈起,并介绍一些主流 O/X Mapping组件的使用方法,比如XStream.Castor.JiBX ...

  10. XML——解析XML文档

    [0]README 0.1)本文描述 转自 core java volume 2, 旨在理解 XML--解析XML文档 的基础知识: 0.2) for source code, please visi ...

最新文章

  1. html背景mov,科技常识:html5自动播放mov格式视频的实例代码
  2. 二叉树-二叉树的最大深度(递归 )
  3. 7.22 校内模拟赛
  4. C++的一些知识点摘抄(创建基本类 高级类)
  5. 判断日期是否为当月最后一天_对比Excel,怎么用Python获取指定月最后一天的日期...
  6. 不恢复余数除法原理_义务教育第一学段中七个除法相关概念的一种理解
  7. 在线html代码生成器,支持网页快速排版 CSS代码一键生成的在线设计工具
  8. C语言—— 符号函数
  9. SRP Batcher,Draw Call优化,Shader SRP Batcher compatible
  10. raw os 之状态机编程
  11. http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1184Elaine's Queue
  12. 【离散数学】命题逻辑
  13. 传美团支付无证经营被央行叫停 限期三个月整改
  14. 上架一款APP,用户量高于1万的概率有多少?
  15. 详解自监督发展趋势! 何恺明连获三年CVPR最高引用的秘诀是?
  16. 国外的码农是什么状态?硅谷程序员:不加班,不穿女装
  17. linux7网卡名确定网卡,centos7 修改默认的网卡名称
  18. 常见支持linux平台的应用软件
  19. oracle 日志 aw,DBMS_AW_EXP: not AW$
  20. 提高软件可靠性的方法和技术

热门文章

  1. oracle创建存储过程报错,oracle创建了存储过程,在PLSQL @路径 执行后报错
  2. 【工具用法】Linux登录吉林大学校园网教程(以deepin为例)
  3. 经纬度坐标转像素坐标
  4. 服务器状态显示异常,进lol显示服务器异常请稍后再试
  5. BASE32编码--记录
  6. Python常用模块12-python的xlsxwriter模块(操作excel)
  7. 拆解全笔记 | 《高阶运营:从小编到新媒体操盘手》
  8. 微信小程序自定义弹窗,禁止page页面滚动。
  9. PS学习笔记2-ps的基础操作
  10. 如何优雅的对网页截取长图