golang中的变量xml标记

时间:2015-08-11 07:16:14

标签: xml go

我正在尝试与我的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"

非常感谢你的帮助!

1 个答案:

答案 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>