编组XML时可选“omitempty”?

时间:2016-03-28 11:15:01

标签: xml go marshalling

我正在尝试为Alfred 2应用程序生成XML。看起来有点像这样:

<items>
    <item autocomplete="My Thing">
        <title>My Thing</title>
    </item>
    <item>
        <title>My Other Thing</title>
    </item>
    <item autocomplete="">
        <title>My Third Thing</title>
    </item>
</items>

我面临的具体挑战是,如果autocomplete上的item属性丢失,那么Alfred的行为会有所不同。

因此,我希望能够提供两种可能性:默认省略属性(omitempty),但可以强制将其设置为空字符串(不是 omitempty)。

我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您可以在要编组的结构中使用指针。如果指针为nil,则将省略该字段。如果它指向一个字符串,它将被渲染(即使该字符串为空)。

Play

type Address struct {
    City *string
}

city1 := "NYC"
city2 := ""
address1 := Address{&city1}
address2 := Address{&city2}
address3 := Address{nil}

enc := xml.NewEncoder(os.Stdout)

enc.Encode(address1) // <Address><City>NYC</City></Address>
enc.Encode(address2) // <Address><City></City></Address>
enc.Encode(address3) // <Address></Address>