Lichen Liu

与其感慨路难行,不如马上出发

  • 主页
所有文章 友链 关于我

Lichen Liu

与其感慨路难行,不如马上出发

  • 主页

golang xml 如何忽略空结构体

2020-01-09

golang 解析XMl encoding/xml.Marshal

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
package main

import (
"encoding/xml"
"fmt"
"os"
)

func main() {
type Address struct {
City, State string
}
type Person struct {
XMLName xml.Name `xml:"person"`
Id int `xml:"id,attr"`
FirstName string `xml:"name>first"`
LastName string `xml:"name>last"`
Age int `xml:"age"`
Height float32 `xml:"height,omitempty"`
Married bool
Address
Comment string `xml:",comment"`
}

v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
v.Comment = " Need more details. "
v.Address = Address{"Hanga Roa", "Easter Island"}

output, err := xml.MarshalIndent(v, " ", " ")
if err != nil {
fmt.Printf("error: %v\n", err)
}

os.Stdout.Write(output)
}

其中Height float32 `xml:"height,omitempty"` 这里的omitempty 用于表示如果Height 为空则不输出在XML 中,文档中解释为:

1
2
3
4
- a field with a tag including the "omitempty" option is omitted
if the field value is empty. The empty values are false, 0, any
nil pointer or interface value, and any array, slice, map, or
string of length zero.

使用时发现对于struct,例如:

1
2
3
4
5
6
7
8
9
type Email struct {
Where string `xml:"where,attr"`
Addr string
}
type Result struct {
XMLName xml.Name `xml:"Person"`
Name string `xml:",omitempty"`
Test Email `xml:",omitempty"`
}

如果Email 没有赋予初值,运行时成员Test仍然会被放到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
package main

import (
"encoding/xml"
"fmt"
)

func main() {
type Email struct {
Where string `xml:"where,attr"`
Addr string
}
type Result struct {
XMLName xml.Name `xml:"Person"`
Name string `xml:",omitempty"`
Test Email `xml:",omitempty"`
}
v := Result{Name: "myname"}
resultxml, _ := xml.MarshalIndent(v, " ", " ")
fmt.Println(string(resultxml))
fmt.Printf("XMLName: %#v\n", v.XMLName)
fmt.Printf("Name: %q\n", v.Name)
fmt.Printf("Test: %q\n", v.Test)

}

输出结果:

1
2
3
4
5
6
7
8
9
  <Person>
<Name>myname</Name>
<Test where="">
<Addr></Addr>
</Test>
</Person>
XMLName: xml.Name{Space:"", Local:""}
Name: "myname"
Test: {"" ""}

经查询,文档里确实没有明确指明如果元素是个结构体,即便是空的也不会被忽略,但文档里有说如果是个指针,空的就可以忽略了:

1
2
3
4
5
type Result struct {
XMLName xml.Name `xml:"Person"`
Name string `xml:",omitempty"`
Test *Email `xml:",omitempty"`
}
1
2
3
4
5
6
 <Person>
<Name>myname</Name>
</Person>
XMLName: xml.Name{Space:"", Local:""}
Name: "myname"
Test: %!q(*main.Email=<nil>)
  • golang
  • xml
  • omitempty

扫一扫,分享到微信

微信分享二维码
Linux 网络bond mode 4 的xmit_hash_policy layer3+4 到底是如何hash 的
libvirt-go 的一个坑
© 2023 Lichen Liu
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • Linux
  • golang
  • xml
  • omitempty
  • test
  • art
  • AWS
  • Kernel
  • bonding
  • sk_buff
  • kernel
  • libvirt
  • libvirt-go
  • numa
  • ping
  • arp
  • 输入法
  • ovs
  • font
  • manjaro
  • 坑
  • 北京
  • 旅游

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 北京周末

    2023-03-22

    #北京#旅游

  • manjaro kde 升级后中文字体变成方块

    2021-02-18

    #font#manjaro#坑

  • sk_buff 简介

    2020-10-26

    #Linux#sk_buff#kernel

  • 使用ct_state 实现出口放行防火墙

    2020-05-15

    #ovs

  • /dev 下的null, zero, random等文件是怎么来的

    2020-03-07

    #Linux#Kernel

  • NUMA 内存策略 preferred 的效果

    2020-02-20

    #Linux#numa

  • 在linux kernel 源码中搜索syscall 的实现

    2020-02-20

    #Linux

  • 一次ping 遇到Invalid argument 报错的问题

    2020-02-11

    #Linux#ping#arp

  • Linux 网络bond mode 4 的xmit_hash_policy layer3+4 到底是如何hash 的

    2020-01-10

    #Linux#bonding

  • golang xml 如何忽略空结构体

    2020-01-09

    #golang#xml#omitempty

  • libvirt-go 的一个坑

    2020-01-07

    #golang#libvirt#libvirt-go

  • 在AWS 的Amazon Linux 上下载源码

    2019-12-23

    #Linux#AWS#Kernel

  • 中文测试

    2019-12-23

    #test#输入法

  • Hello world

    2019-12-18

    #test#art

  • 肥叉烧
  • 安全大手子
  • 物理学博士
  • 一个愣头青
普通上班族,会一点Linux, 想学SDN