2015-08-11 6 views
1

Я пытаюсь связаться с SOAP-сервисом из моей программы, но у меня возникают трудности с использованием xml package.Переменная тег xml в golang

Большинство запросов, которые я должен отправить иметь следующий формат:

<s:Envelope xmlns="namespace1"> 
<s:Body> 
     <FunctionName xmlns=“namespace2”/> 
</s:Body> 
</s:Envelope> 

Я чувствую, что я должен создать один тип для каждого запроса, я хочу сделать, как FunctionName изменения ... Here «S код, который я использую до сих пор.

Было бы хорошо, если бы я мог иметь один тип с FunctionName как атрибут, но я просто не могу понять, как ... Для того, чтобы сделать его более ясным, я хотел бы поставить переменную вместо FunctionName внутри xml:"s:Body>FunctionName" ,

Большое спасибо за помощь!

ответ

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) 

Output (попробуйте на Go Playground):

<s:Envelope xmlns:s="namespace1"> 
    <s:Body> 
     <MyFuncName xmlns="namespace2"></MyFuncName> 
    </s:Body> 
</s:Envelope> 
Смежные вопросы