Golang XML:解组忽略名称空间

时间:2019-03-25 12:11:04

标签: go

我正在Go系统中实现一项服务,该服务从外部SOAP服务读取数据。现在我正在为此编写测试,我遇到了这个问题:

unable to unmarshal request body for testing: expected element type <soapenv:Envelope> but have <Envelope>

如果我转储数据,我将拥有:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:v2 [...]

所以我在XML中确实有正确的名称空间。作为记录,这是我要尝试将数据解组的结构:

type collectRequestXML struct {
    XMLName xml.Name `xml:"soapenv:Envelope"`
    SoapEnv string   `xml:"xmlns:soapenv,attr"`
    XMLNs   string   `xml:"xmlns:v2,attr"`
    Header  struct{} `xml:"soapenv:Header"`
    Body    struct {
        [...]
    }
}

我该怎么做才能使解组失败?

请参见this Playground item for reference

1 个答案:

答案 0 :(得分:1)

XML软件包的文档对名称空间的描述不够。解析非常简单。对命名空间的支持很小。它可以解析XML,但是当您创建XML ist时,它对名称空间的支持还不够。

当您删除XMLName定义内的名称空间信息时,您的结构有效:

type myStruct struct {
    XMLName xml.Name `xml:"Envelope"`
    SoapEnv string   `xml:"xmlns:soapenv,attr"`
    Header  struct{} `xml:"soapenv:Header"`
    Body    struct {
        MyData string `xml:"my-data"`
    }
}

https://play.golang.org/p/UppXwx0X0i9