热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

go基础:xml解析

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

一、简介

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


二、代码

1.将xml解析为对象

<Person><FullName>Grace R. EmlinFullName><Company>Example Inc.Company><Email where="home"><Addr>gre@example.comAddr>Email><Email where=&#39;work&#39;><Addr>gre@work.comAddr>Email><Group><Value>FriendsValue><Value>SquashValue>Group><City>Hanga RoaCity><State>Easter IslandState>
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 := `

Grace R. EmlinExample Inc.gre@example.comgre@work.comFriendsSquashHanga RoaEaster Island`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 GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
手浪用户2602884673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有