经过一番周折后,我想分享一下我正在处理的问题。

我正在填充结构并将其转换为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

10-08 11:33