我正在尝试与我的go程序中的SOAP服务进行通信,但是我很难使用xml package。
我发送的大多数请求都采用以下格式:
<s:Envelope xmlns="namespace1">
<s:Body>
<FunctionName xmlns=“namespace2”/>
</s:Body>
</s:Envelope>
我觉得我必须为我想要制作的每个请求创建一种类型,因为FunctionName
更改... Here是我目前使用的代码。
如果我可以使用FunctionName
作为属性的单一类型,那将是很好的但我无法弄清楚如何...为了使它更清楚,我想放一个变量而不是FunctionName
内的xml:"s:Body>FunctionName"
。
非常感谢你的帮助!
答案 0 :(得分:2)
您可以使用xml.Name
字段在XML输出中指定所需的标记名称。请注意,对于xml.Name
,您还可以指定命名空间,因此您甚至不再需要Command.Field
,而您只需要设置命名空间属性。
所以这是你修改过的代码:
type Command struct {
XMLName xml.Name
}
type XMLEnvelop struct {
XMLName xml.Name `xml:"s:Envelope"`
Xmlns string `xml:"xmlns:s,attr"`
FunctionName Command `xml:"s:Body>FunctionName"`
}
v := &XMLEnvelop{Xmlns: "namespace1",
FunctionName: Command{xml.Name{"namespace2", "MyFuncName"}}}
output, err := xml.MarshalIndent(v, "", " ")
if err != nil {
fmt.Printf("error: %v\n", err)
}
// Write the output to check
os.Stdout.Write(output)
输出(在Go Playground上尝试):
<s:Envelope xmlns:s="namespace1">
<s:Body>
<MyFuncName xmlns="namespace2"></MyFuncName>
</s:Body>
</s:Envelope>