我有一个Web服务,希望能收到两个不同的请求;一个称为Request
,仅包含一个Request
,另一个称为RequestBulk
,其中包含Request
个数组。两者都映射到Golang结构,如下所示:
type RequestBulk struct {
XMLName xml.Name `xml:"https://item.com RequestBulk"`
Message string `xml:"Message"`
Request []Request `xml:"Request,omitempty"`
}
type Request struct {
XMLName xml.Name `xml:"https://item.com Request"`
Text string `xml:"text"`
}
解组以下XML可以按预期工作:
<Request xmlns="https://item.com">
<text>Some request text</text>
</Request>
<RequestBulk xmlns="https://item.com">
<Message>Some Text</Message>
<Request xmlns="https://item.com">
<text>Some request text</text>
</Request>
<Request xmlns="https://item.com">
<text>Some other request text</text>
</Request>
</RequestBulk>
在RequestBulk
中,如果我更改
Request []Request `xml:"Request,omitempty"`
到
RequestMessage []Request `xml:"RequestMessage,omitempty"`
并将XML更改为:
<RequestBulk xmlns="https://item.com">
<Message>Some Text</Message>
<RequestMessage xmlns="https://item.com">
<text>Some request text</text>
</RequestMessage>
<RequestMessage xmlns="https://item.com">
<text>Some other request text</text>
</RequestMessage>
</RequestBulk>
我收到以下错误:
期望的元素类型为
,但具有
显然是因为XMLName xml.Name `xml:"https://item.com Request"`
我如何保持Request
结构不变,并且仍然接受类型为RequestBulk
的{{1}}类型的消息,即Request
?
换句话说;如何在不同的名称空间中使用相同的结构?
在Go Playground上运行它。
答案 0 :(得分:1)
您可以实施Unmarshaler
接口以覆盖元素的本地名称,然后再将其传递给解码器进行实际的编组。
func (r *Request) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
if start.Name.Local == "RequestMessage" {
start.Name.Local = "Request" // overwrite
}
type tmp Request // avoid infinite recursive calls to Request.UnmarshalXML
return d.DecodeElement((*tmp)(r), &start) // unmarshal
}