Go 使用额外的标记将结构封送到xml

Go 使用额外的标记将结构封送到xml,go,Go,我正在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"` } 当Say数组填充两个包含“Something

我正在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"`
}
当Say数组填充两个包含“Something”和“Something other”的Say结构时,会生成:

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

找到了使用接口的解决方案

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

    Text string `xml:",chardata"`
}

type Response struct {
    XMLName xml.Name `xml:"Response"`
    Says []interface{}
}
缺少实际类型名不会生成“Says”标记

var r Response

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

找到了使用接口的解决方案

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

    Text string `xml:",chardata"`
}

type Response struct {
    XMLName xml.Name `xml:"Response"`
    Says []interface{}
}
缺少实际类型名不会生成“Says”标记

var r Response

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

因此,基本上你想确保你有一个有效的序列,在这个序列中,暂停应该只在一个
后面,比如说通过结构标记来进行的
?是的,这就是我想说的,这仅仅是结构标记是不可能的,听起来更像是XSD的工作。当然,您可以使用标记器编写自定义验证器,如果遇到的第一个元素是暂停,则会失败。然而,使用XSD还是自定义验证器在很大程度上取决于您的用例。因此,基本上,您希望确保有一个有效的序列,在这个序列中,暂停应该只通过结构标记在
后面,比如说
?是的,这就是我想要的,仅使用结构标记是不可能的,听起来更像是XSD的作业。当然,您可以使用标记器编写自定义验证器,如果遇到的第一个元素是暂停,则会失败。然而,使用XSD还是自定义验证器在很大程度上取决于您的用例。