Golang中数组的XML解组属性不同

ifnotak:

我有一个Web服务,希望能收到两个不同的请求。一个被称为Request仅包含一个Request,另一个被称为RequestBulk包含Requests 的数组两者都映射到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上运行它

mkopriva:

您可以实现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
}

https://play.golang.org/p/0a_gpgkywwf

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章