尝试使用 Golang encoding/xml 将结构编码为 xml 具有交替重复模式的结构
Trying to use Golang encoding/xml to encode a struct to xml a structure with an alternating repeating pattern
我正在尝试使用 encoding/xml 包按以下顺序创建一个 xml 文件,我已经为静态子元素和过渡子元素定义了结构,现在的问题是我需要为了以重复格式使用它,所以我创建了另一个结构来保存静态和过渡结构的切片,但结果是静态元素全部出现在过渡元素之前,但我需要它们按顺序交替。
这是我想要的结构:
<background>
//...
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
//...
</background>
但这就是我得到的:
<background>
//...
<static>
<duration></duration>
<file></file>
</static>
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
<transition>
<duration>
<from></from>
<to></to>
</transition>
//...
</background>
关于我如何做到这一点的任何帮助。
这些是我创建的结构:
type Static struct {
Duration int `xml:"duration"`
File string `xml:"file"`
}
type Transition struct {
Duration float64 `xml:"duration"`
From string `xml:"from"`
To string `xml:"to"`
}
type ST struct {
Static []Static `xml:"static"`
Transition []Transition `xml:"transition"`
}
type Background struct {
XMLName xml.Name `xml:"background"`
Comment string `xml:",comment"`
ST
}
这个
type Static struct {
XMLName string `xml:"static"`
Duration int `xml:"duration"`
File string `xml:"file"`
}
type Transition struct {
XMLName string `xml:"transition"`
Duration float64 `xml:"duration"`
From string `xml:"from"`
To string `xml:"to"`
}
type Background struct {
XMLName string `xml:"background"`
Items []interface{}
}
bk := Background{
Items: []interface{}{
&Static{
Duration: 11,
File: "foo",
},
&Transition{
Duration: 22,
From: "aaa",
To: "bbb",
},
&Static{
Duration: 33,
File: "bar",
},
&Transition{
Duration: 44,
From: "xxx",
To: "yyy",
},
},
}
out, err := xml.Marshal(&bk)
应该有你的保障 (playground)。
请注意,为了获得正确序列化的元素列表——按照指定的顺序一个接一个地排列——元素列表,您必须使用反映这一点的数据结构;
Go 切片最适合这种简单的情况。
在复杂的情况下,可以让您的自定义类型实现 encoding/xml.Marshaler
接口并使用较低级别的 encoding/xml
工具以您希望的任何顺序对单个 emenets 进行编码。
我正在尝试使用 encoding/xml 包按以下顺序创建一个 xml 文件,我已经为静态子元素和过渡子元素定义了结构,现在的问题是我需要为了以重复格式使用它,所以我创建了另一个结构来保存静态和过渡结构的切片,但结果是静态元素全部出现在过渡元素之前,但我需要它们按顺序交替。 这是我想要的结构:
<background>
//...
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
//...
</background>
但这就是我得到的:
<background>
//...
<static>
<duration></duration>
<file></file>
</static>
<static>
<duration></duration>
<file></file>
</static>
<transition>
<duration>
<from></from>
<to></to>
</transition>
<transition>
<duration>
<from></from>
<to></to>
</transition>
//...
</background>
关于我如何做到这一点的任何帮助。 这些是我创建的结构:
type Static struct {
Duration int `xml:"duration"`
File string `xml:"file"`
}
type Transition struct {
Duration float64 `xml:"duration"`
From string `xml:"from"`
To string `xml:"to"`
}
type ST struct {
Static []Static `xml:"static"`
Transition []Transition `xml:"transition"`
}
type Background struct {
XMLName xml.Name `xml:"background"`
Comment string `xml:",comment"`
ST
}
这个
type Static struct {
XMLName string `xml:"static"`
Duration int `xml:"duration"`
File string `xml:"file"`
}
type Transition struct {
XMLName string `xml:"transition"`
Duration float64 `xml:"duration"`
From string `xml:"from"`
To string `xml:"to"`
}
type Background struct {
XMLName string `xml:"background"`
Items []interface{}
}
bk := Background{
Items: []interface{}{
&Static{
Duration: 11,
File: "foo",
},
&Transition{
Duration: 22,
From: "aaa",
To: "bbb",
},
&Static{
Duration: 33,
File: "bar",
},
&Transition{
Duration: 44,
From: "xxx",
To: "yyy",
},
},
}
out, err := xml.Marshal(&bk)
应该有你的保障 (playground)。
请注意,为了获得正确序列化的元素列表——按照指定的顺序一个接一个地排列——元素列表,您必须使用反映这一点的数据结构; Go 切片最适合这种简单的情况。
在复杂的情况下,可以让您的自定义类型实现 encoding/xml.Marshaler
接口并使用较低级别的 encoding/xml
工具以您希望的任何顺序对单个 emenets 进行编码。