首页 > 解决方案 > 将结构编组为带有额外标记的 xml

问题描述

我正在用 Go 开发一个 twilio 电话服务器,并有一些引用要生成的 xml 的结构。

例如:

type Say struct {
    XMLName xml.Name `xml:"Say"`

    Text string `xml:",chardata"`
}

type Response struct {
    XMLName xml.Name `xml:"Response"`
    Says []Say `xml:",omitempty"`
}

当 Says 数组填充了两个包含 'Something' 和 'Something else' 的 Say 结构时,将生成:

<Response>
  <Say>Something</Say>
  <Say>Something else</Say>
</Response>

但是在大声说出“某事”之后,没有停顿,“其他事情”紧随其后。

twilio 为此创建了一个暂停标签,让它暂停一秒钟。所以我想要的是像这样生成一个xml:

<Response>
  <Say>Something</Say>
  <Pause></Pause>
  <Say>Something else</Say>
  <Pause></Pause>
</Response>

但是如何在 go 结构中表示呢?如何挤入一个额外的 Pause 标签作为 Say 标签的兄弟?

type Say struct {
    XMLName xml.Name `xml:"Say"`

    Text string `xml:",chardata"`
    ???? Pause `xml:Pause,sibling?????`
}

type Response struct {
    XMLName xml.Name `xml:"Response"`
    Says []Say `xml:",omitempty"`
}

标签: go

解决方案


使用接口找到解决方案

type Say struct {
    XMLName xml.Name `xml:"Say"`

    Text string `xml:",chardata"`
}

type Response struct {
    XMLName xml.Name `xml:"Response"`
    Says []interface{}
}

缺少实际类型名称不会生成“说”标签。

var r Response

r.Says = append(r.Says, Say { Text: "hello"})

推荐阅读