Go语言学习笔记—golang标准库xml包


xml包实现xml解析。

一 核心函数

1.1 将struct转码成xml

func Marshal(v interface{
   }) ([]byte, error)
func MarshalIndent(v interface{
   }, prefix, indent string) ([]byte, error)

可以使用Marshal函数和MarshalIndent函数返回XML编码。

MarshalIndent函数功能类似于Marshal函数。区别在于有无缩进

Marshal处理数组或者切片时会序列化每一个元素。Marshal处理指针时,会序列化其指向的值;如果指针为nil,则啥也不输出。Marshal处理接口时,会序列化其内包含的具体类型值,如果接口值为nil,也是不输出。Marshal处理其余类型数据时,会输出一或多个包含数据的XML元素。

将结构体转换为XML输出时,需要注意以下规则:

  • XMLName字段会省略
  • 具有标签"-"的字段会省略
  • 具有标签"name,attr"的字段会成为该XML元素的名为name的属性
  • 具有标签",attr"的字段会成为该XML元素的名为字段名的属性
  • 具有标签",chardata"的字段会作为字符数据写入,而非XML元素
  • 具有标签",innerxml"的字段会原样写入,而不会经过正常的序列化过程
  • 具有标签",comment"的字段作为XML注释写入,而不经过正常的序列化过程,该字段内不能有"–"字符串
  • 标签中包含"omitempty"选项的字段如果为空值会省略
    空值为false、0、nil指针、nil接口、长度为0的数组、切片、映射
  • 匿名字段(其标签无效)会被处理为其字段是外层结构体的字段
  • 如果一个字段的标签为"a>b>c",则元素c将会嵌套进其上层元素a和b中。如果该字段相邻的字段标签指定了同样的上层元素,则会放在同一个XML元素里。

1.2 将xml转码成struct

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

Unmarshal解析XML编码的数据并将结果存入v指向的值。v只能指向结构体、切片或者和字符串。

解析XML编码时,需要遵守以下规则:

  • 如果结构体字段的类型为字符串或者[]byte,且标签为",innerxml",
    Unmarshal函数直接将对应原始XML文本写入该字段,其余规则仍适用。
  • 如果结构体字段类型为xml.Name且名为XMLName,Unmarshal会将元素名写入该字段
  • 如果字段XMLName的标签的格式为"name"或"namespace-URL name",
    XML元素必须有给定的名字(以及可选的名字空间),否则Unmarshal会返回错误。
  • 如果XML元素的属性的名字匹配某个标签",attr"为字段的字段名,或者匹配某个标签为"name,attr"的字段的标签名,Unmarshal会将该属性的值写入该字段。
  • 如果XML元素包含字符数据,该数据会存入结构体中第一个具有标签",chardata"的字段中,
    该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
  • 如果XML元素包含注释,该数据会存入结构体中第一个具有标签",comment"的字段中,
    该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
  • 如果XML元素包含一个子元素,其名称匹配格式为"a"或"a>b>c"的标签的前缀,反序列化会深入XML结构中寻找具有指定名称的元素,并将最后端的元素映射到该标签所在的结构体字段。
    以">“开始的标签等价于以字段名开始并紧跟着”>" 的标签。
  • 如果XML元素包含一个子元素,其名称匹配某个结构体类型字段的XMLName字段的标签名,
    且该结构体字段本身没有显式指定标签名,Unmarshal会将该元素映射到该字段。
  • 如果XML元素的包含一个子元素,其名称匹配够格结构体字段的字段名,且该字段没有任何模式选项(“,attr”、",chardata"等),Unmarshal会将该元素映射到该字段。
  • 如果XML元素包含的某个子元素不匹配以上任一条,而存在某个字段其标签为",any",
    Unmarshal会将该元素映射到该字段。
  • 匿名字段被处理为其字段好像位于外层结构体中一样。
  • 标签为"-"的结构体字段永不会被反序列化填写。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值