XML元帅:切片的意外输出

问题描述

一个结构,其中一个切片是其成员之一:

type Package struct {
    Name string
    ...
    Files []File
}

type File struct {
    Name string
    ...
}

我使用encoding/xml来封送此结构。这就是我得到的:

<Package>
    <Name>example</Name>
    <Files>
        <Name>Example1</Name>
    </Files>
    <Files>
        <Name>Example2</Name>
    </Files>
</Package>

这不是我想要的行为。我想将其编组为这种格式:

<Package>
    <Name>example</Name>
    <Files>
        <File>
            <Name>Example1</Name>
        </File>
        <File>
            <Name>Example2</Name>
        </File>
    </Files>
</Package>

我是Golang的新手,对它的切片和编组机制了解不多。尽管这听起来像是一个愚蠢的问题,但是我该如何实现预期的(第二种)格式?

解决方法

encoding/xml的相关文档中对编排和解编规则进行了很好的规定。例如,xml.Marshal上的部分说:

如果字段使用标签“ a> b> c”,则元素c将被嵌套 在父元素a和b中。彼此相邻出现的字段 该名称相同的父对象将包含在一个XML元素中。


因此,您应该能够通过此实现您想要的:

type Package struct {
    Name  string
    Files []File `xml:"Files>File"`
}

// this also works
type Package struct {
    Name  string
    Files []File `xml:">File"`
}

https://play.golang.org/p/gg-6Tj3WNnV