2013-04-24 13 views
5

Próbuję achive następujące dane wyjściowe XMLMarshalling XML Go XMLName + xmlns

<?xml version="1.0" encoding="UTF-8"?> 

<CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/2012-12-12/"> 
    <Name>DNS domain name</Name> 
    <CallerReference>unique description</CallerReference> 
    <HostedZoneConfig> 
     <Comment>optional comment</Comment> 
    </HostedZoneConfig> 
</CreateHostedZoneRequest> 

Mam następujący która wyprowadza XML, który jest bardzo blisko ale nie byłem w stanie zakodować w CreateHostedZoneRequest

xmlns = "https://route53.amazonaws.com/doc/2012-12-12/

package main 

import "fmt" 
import "encoding/xml" 

type ZoneRequest struct { 
    Name   string 
    CallerReference string 
    Comment   string `xml:"HostedZoneConfig>Comment"` 
} 

var zoneRequest = ZoneRequest{ 
    Name:   "DNS domain name", 
    CallerReference: "unique description", 
    Comment:   "optional comment", 
} 

func main() { 
    tmp, _ := createHostedZoneXML(zoneRequest) 
    fmt.Println(tmp) 
} 

func createHostedZoneXML(zoneRequest ZoneRequest) (response string, err error) { 
    tmp := struct { 
    ZoneRequest 
    XMLName struct{} `xml:"CreateHostedZoneRequest"` 
    }{ZoneRequest: zoneRequest} 

    byteXML, err := xml.MarshalIndent(tmp, "", ` `) 
    if err != nil { 
    return "", err 
    } 
    response = xml.Header + string(byteXML) 
    return 
} 

http://play.golang.org/p/pyK76VPD5-

Jak mogę zakodować xmlns w CreateHostedZoneRequest?

Odpowiedz

3

Można to zrobić, co może nie jest najbardziej eleganckie rozwiązanie, ale wydaje się działać

Playground link

type ZoneRequest struct { 
    Name   string 
    CallerReference string 
    Comment   string `xml:"HostedZoneConfig>Comment"` 
    Xmlns   string `xml:"xmlns,attr"` 
} 

var zoneRequest = ZoneRequest{ 
    Name:   "DNS domain name", 
    CallerReference: "unique description", 
    Comment:   "optional comment", 
    Xmlns:   "https://route53.amazonaws.com/doc/2012-12-12/", 
} 

Produkcja

<?xml version="1.0" encoding="UTF-8"?> 

<CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/2012-12-12/"> 
    <Name>DNS domain name</Name> 
    <CallerReference>unique description</CallerReference> 
    <HostedZoneConfig> 
     <Comment>optional comment</Comment> 
    </HostedZoneConfig> 
</CreateHostedZoneRequest> 
5

miałem podobne pytanie. Docs dla metody unmarshal (http://golang.org/pkg/encoding/xml/#Unmarshal) mają:

Jeśli pole XMLName ma przypisany znacznik postaci „nazwa” lub „nazwa przestrzeni nazw URL”, element XML musi mieć imię (i, opcjonalnie, przestrzeń nazw) lub w przeciwnym razie Unmarshal zwróci błąd.

Używanie "nazwa przestrzeni nazw URL" w tagu struct:

type ZoneRequest struct { 
    XMLName xml.Name `xml:"https://route53.amazonaws.com/doc/2012-12-12/ CreateHostedZoneRequest"` 
} 

powinna przedstawić:

<CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/2012-12-12/"> 
Powiązane problemy