我有一个Web服务,希望能收到两个不同的请求。一个被称为Request
仅包含一个Request
,另一个被称为RequestBulk
包含Request
s 的数组。两者都映射到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>
我收到以下错误:
预期的元素类型<Request>,但具有<RequestMessage>
显然是因为 XMLName xml.Name `xml:"https://item.com Request"`
如何保持Request
结构不变,并且仍然接受RequestBulk
结构名称不同的消息Request
,即RequestMessage
?
换一种说法; 如何在不同的名称空间中使用相同的结构?
在Go Playground上运行它。
您可以实现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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句