第二章里还提到了xml的解析部分。之前有想整理下encoding包下常用的几个文件格式的处理。这次刚好整理下xml的部分.先上例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main
import (
"bytes"
"encoding/xml"
"fmt"
"os"
)
type rss2 struct {
XMLName xml.Name `xml:"rss"`
ChannelDoc channel `xml:"channel"`
}
type channel struct {
XMLName xml.Name `xml:"channel"`
Title string `xml:"title"`
Description string `xml:"description"`
Link string `xml:"link"`
He string `xml:"heh"`
Item []item `xml:"item"`
}
type item struct {
XMLName xml.Name `xml:"item"`
Title string `xml:"title"`
Guid guid `xml:"guid"`
}
type guid struct {
GuidValue string `xml:",chardata"`
GuidAttr string `xml:"isPermaLink,attr"`
}
func () {
s := `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>RSS Title</title>
<description>This is an example of an RSS feed</description>
<link>http://www.example.com/main.html</link>
<lastBuildDate>Mon, 06 Sep 2010 00:01:00 +0000 </lastBuildDate>
<pubDate>Sun, 06 Sep 2009 16:20:00 +0000</pubDate>
<ttl>1800</ttl>
<item>
<title>Example entry</title>
<description>Here is some text containing an interesting description.</description>
<link>http://www.example.com/blog/post/1</link>
<guid isPermaLink="true">7bd204c6-1655-4c27-aeee-53f933c5395f</guid>
<pubDate>Sun, 06 Sep 2009 16:20:00 +0000</pubDate>
</item>
<item>
<title>Example entry2</title>
<description>Here is some text containing an interesting description.</description>
大专栏  golang xml解析"> <link>http://www.example.com/blog/post/12</link>
<guid isPermaLink="true">7bd204c6-1655-4c27-aeee-53f933c53952f</guid>
<pubDate>Sun, 06 Sep 2009 16:20:00 +0000</pubDate>
</item>
</channel>
</rss>`
st := new(rss2)
err := xml.NewDecoder(bytes.NewBuffer([]byte(s))).Decode(st)
if err == nil {
fmt.Println(st)
} else {
fmt.Println(err)
}
err = xml.NewEncoder(os.Stdout).Encode(st)
fmt.Println()
st2 := new(rss2)
err = xml.Unmarshal([]byte(s), st2)
if err == nil {
fmt.Println(st2)
}
result, _ := xml.Marshal(st2)
fmt.Println(string(result))
fmt.Println(st2.ChannelDoc.Item[0].Guid.GuidAttr)
}

(代码里的xml来自rss wiki示例)

首先将xml 解析成指定的interface{},这里则是以struct作为例子。
既然是struct,首先提下映射规则。首先struct的字段必须是可导出的。第二tag的优先级是最高的。就是代码里的

1
`xml:"rss"`

这些内容,然后他也会根据可导出的字段名来映射。当然如果想要忽略部分字段只需要在tag里写”-“即可
比如上面代码里的He这个字段,这是一个干扰项,xml里并没有对应的节点,虽然他并不会解析出内容,但是在还原成xml时他是会占用heh这个节点的。只需要改成xml:"-"在还原的xml里就不会看到这个字段了(当然这样写就不对,都是根据数据来定义struct的,这里只是举个例子)。
至于优先级的问题,就比如

1
GuidAttr string `xml:"isPermaLink,attr"`

这个字段的定义。他是获取guid节点中的isPermaLink这个attribution.还原后的自然是isPermaLink而不是GuidAttr.
同理的还有rss2 这个typeName.不过这里有些特殊:XMLName以及类型xml.Name是固定写法,是来指定根节点的。这里也是故意写成rss2,对应的节点是rss.在tag的作用下还原后是rss.不然的话会是rss2.因为没有XMLName的话会根据类型名做转换。
还有就是,chardata这个写法.这是来获取value值的。

接下来就是方法的解释了

1
func Unmarshal(data []byte, v interface{}) error

这个方法很简单,src是byte数组,dst是interface{}.这里自然是struct.(这里使用指针是因为后面需要将其作为对象操作,查看其值,不然用过后就抛弃了,无法操作)
返回一个error这个方法没什么好说的。
对应的方法是Marshal.

1
func Marshal(v interface{}) ([]byte, error)

同理,与Unmarshal对应即可

1
2
3
4
5
func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.Writer) *Encoder
func (d *Decoder) Decode(v interface{}) error
func (enc *Encoder) Encode(v interface{}) error

这里是对应的两组方法。上面则是返回对应的struct.参数只要是符合io.Reader以及io.Writer接口即可。分别做数据源读入以及输出。这里就简单用buffer和stdout举例了。
构造完成之后则调用对应的编解码方法即可。
其实解析的方法很简单,主要是映射关系的管理。简单应用应该就是像上面所写的那样了。还有就是今天群里有大神语音解惑,但是因为个人水平问题,听的很懵。很气但是无可奈何。自己mark下。我还会回去的,到时候一定可以听懂的!

golang xml解析的更多相关文章

  1. golang xml和json的解析与生成

    golang中解析xml时我们通常会创建与之对应的结构体,一层层嵌套,完成复杂的xml解析. package main; import ( "encoding/xml" " ...

  2. Golang配置文件解析-oozgconf

    代码地址如下:http://www.demodashi.com/demo/14411.html 简介 oozgconf基于Golang开发,用于项目中配置文件的读取以及加载,是一个轻量级的配置文件工具 ...

  3. xml解析技术

    本文总结Dom,sax解析,  使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的 ...

  4. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...

  5. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  6. 【Android】实现XML解析的几种技术

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  7. 定位和xml解析和gson解析加上拉加载,下拉刷新

    这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...

  8. tinyxml一个优秀的C++ XML解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  9. PERL/LEX/YACC技术实现文本解析--XML解析

    继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...

随机推荐

  1. SQL查询出一个表数据插入到另一个表里

    下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...

  2. 17.3.13--python编码问题

    1----字符编码: 字符编码(英语:Character encoding).字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式.自然数串行.8位组或者电脉冲),以便文本在计算机中存储和 ...

  3. Opencv笔记(二):图像的基本操作——续写

    1.图像的透视变换 对于视角变换,我们需要一个 3x3 变换矩阵.在变换前后直线还是直线.要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图像上对应的位置.这四个点中的任意三个都不能 ...

  4. Linux平台下_tomcat的安装与优化

    一.Tomcat介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一 ...

  5. 2018 ACM-ICPC 宁夏 C.Caesar Cipher(模拟)

    In cryptography, a Caesar cipher, also known as the shift cipher, is one of the most straightforward ...

  6. npm 切换成淘宝镜像

    npm install nrm -g nrm use taobao

  7. C#面向对象---对象成员、方法加载、引用类库

    一.方法重载: 1.两个函数同名,就互相构成方法的重载关系 2.重载的函数,必须跟其他函数之间具有不同的参数类型或参数个数 二.字段与属性 类的字段: 类里面是可以直接定义变量的,这些变量就叫类的字段 ...

  8. 卸载python3

    rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps 卸载pyhton3 whereis python3 |xargs rm -frv 删除 ...

  9. spring cloud关于feign client的调用对象列表参数、设置header参数、多环境动态参数试配

    spring cloud关于feign client的调用 1.有些场景接口参数需要传对象列表参数 2.有些场景接口设置设置权限等约定header参数 3.有些场景虽然用的是feign调用,但并不会走 ...

  10. SpringBoot1.X /2.X使用@Component注解注入为java.lang.NullPointException 问题小结

    问题简述: 我们在使用Spring系的产品的时候总是想当然的以为所有指定的Bean都会让Spring来管理,其实不然,即使是Spring出品的产品也不全是的哦,以下是我遇到的一个使用@Componen ...