经过一番周折后,我想分享一下我正在处理的问题。
我正在填充结构并将其转换为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>
添加
另外,我尝试执行以下操作,但仍会生成一个空的“Group1”:
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的示例可以很好地隐藏空的父级,但是填充它会使难度加大。 “
panic: runtime error: invalid memory address or nil pointer dereference
” 最佳答案
Example1
不起作用,因为显然,omitempty
标记仅适用于元素本身,而不适用于包围a>b>c
的元素。Example2
不起作用,因为,omitempty
不能将空结构识别为空。 From the doc:
没有提及结构。您可以通过将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",
}
示例:http://play.golang.org/p/mgpI4OsHf7