经过一些追踪和错误之后,我想分享我正在处理的问题。
我填充结构并将其转换为XML(xml.Marshal) 如下所示,Foo示例按预期工作。但是Bar示例创建了一个空group1。
所以我的问题是:"如果没有设置子代,如何防止生成Group1。"
package main
import (
"fmt"
"encoding/xml"
)
type Example1 struct{
XMLName xml.Name `xml:"Example1"`
Element1 string `xml:"Group1>Element1,omitempty"`
Element2 string `xml:"Group1>Element2,omitempty"`
Element3 string `xml:"Group2>Example3,omitempty"`
}
func main() {
foo := &Example1{}
foo.Element1 = "Value1"
foo.Element2 = "Value2"
foo.Element3 = "Value3"
fooOut, _ := xml.Marshal(foo)
fmt.Println( string(fooOut) )
bar := &Example1{}
bar.Element3 = "Value3"
barOut, _ := xml.Marshal(bar)
fmt.Println( string(barOut) )
}
Foo输出:
<Example1>
<Group1>
<Element1>Value1</Element1>
<Element2>Value2</Element2>
</Group1>
<Group2>
<Example3>Value3</Example3>
</Group2>
</Example1>
酒吧输出:
<Example1>
<Group1></Group1> <------ How to remove the empty parent value ?
<Group2>
<Example3>Value3</Example3>
</Group2>
</Example1>
加成
此外我尝试过以下操作,但仍会生成一个空的&#34; Group1&#34;:
type Example2 struct{
XMLName xml.Name `xml:"Example2"`
Group1 struct{
XMLName xml.Name `xml:"Group1,omitempty"`
Element1 string `xml:"Element1,omitempty"`
Element2 string `xml:"Element2,omitempty"`
}
Element3 string `xml:"Group2>Example3,omitempty"`
}
完整代码可在此处找到:http://play.golang.org/p/SHIcBHoLCG。
的例子编辑:更改了golang示例以使用MarshalIndent获取可读性
编辑2 来自Ainar-G Works的示例很适合隐藏空父,但填充它会让它变得更难。 &#34; panic: runtime error: invalid memory address or nil pointer dereference
&#34;
答案 0 :(得分:12)
Example1
不起作用,因为,omitempty
标记显然只适用于元素本身,而不适用于a>b>c
封闭元素。
Example2
无法正常工作,因为,omitempty
无法将空结构识别为空。 From the doc:
空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,映射或字符串。
没有提到结构。您可以通过将baz
更改为指向结构的指针来使Group1
示例工作:
type Example2 struct {
XMLName xml.Name `xml:"Example1"`
Group1 *Group1
Element3 string `xml:"Group2>Example3,omitempty"`
}
type Group1 struct {
XMLName xml.Name `xml:"Group1,omitempty"`
Element1 string `xml:"Element1,omitempty"`
Element2 string `xml:"Element2,omitempty"`
}
然后,如果您要填写Group1
,则需要单独分配:
foo.Group1 = &Group1{
Element1: "Value1",
}