2017-06-23 5 views
1

J'essaye de unmarshall dans une variable du type d'interface aller vide. Le type concret a des balises xml correctes, mais pour une raison quelconque je ne peux pas unmarshall les valeurs de xml. Ils viennent juste de se vider.Unmarshalling à l'interface vide instanciée dans golang

Ce code fait ce que je veux faire:

type Address struct { 
    City, State string 
} 

type Result struct { 
    XMLName xml.Name `xml:"Person"` 
    Name string `xml:"FullName" json:"FullName"` 
    Address interface{} 
} 

func main() { 

    xmlAddress := &Address{} 
    xmlResult := &Result{Name: "none", Address: xmlAddress} 

    xmlData := ` 
    <Person> 
     <FullName>Mike McCartney</FullName> 
     <Address> 
      <City>Austin</City> 
      <State>Texas</State> 
     </Address> 
    </Person> 
` 

    err := xml.Unmarshal([]byte(xmlData), xmlResult) 

    // xmlResult = {"XMLName":{"Space":"","Local":"Person"},"FullName":"Mike McCartney","Address":{"City":"Austin","State":"Texas"}} 
} 

code complet: https://play.golang.org/p/QXyoOPMFZr

Mais dans mon exemple avec XML réel avec espaces de noms, il ne fonctionne pas:

type Envelope struct { 
    XMLName xml.Name `xml:"http://www.w3.org/2003/05/soap-envelope Envelope"` 
    Body Body  `xml:"http://www.w3.org/2003/05/soap-envelope Body"` 
} 

type Body struct { 
    XMLName xml.Name `xml:"http://www.w3.org/2003/05/soap-envelope Body"` 
    Content interface{} 
} 

type DebtorGetNameResponse struct { 
    XMLName    xml.Name `xml:"http://e-conomic.com Debtor_GetNameResponse"` 
    DebtorGetNameResult string `xml:"Debtor_GetNameResult"` 
} 

func main() { 

    xmlData := ` 
    <?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
     <soap:Body> 
      <Debtor_GetNameResponse xmlns="http://e-conomic.com"> 
       <Debtor_GetNameResult>THIS SHOULD BE IN THE OUTPUT</Debtor_GetNameResult> 
      </Debtor_GetNameResponse> 
     </soap:Body> 
    </soap:Envelope>` 

    e := new(Envelope) 
    res := new(DebtorGetNameResponse) 
    e.Body = Body{Content: res} 

    err := xml.Unmarshal([]byte(xmlData), e) 

    // res = {"XMLName":{"Space":"","Local":""},"DebtorGetNameResult":""} 
} 

Code complet: https://play.golang.org/p/AsV1LGW1lR

+0

Vous ne pouvez pas instancier une interface, vous ne pouvez avoir qu'une variable d'un type d'interface qui contient une instance d'un type concret. – Adrian

+0

@Adrian, c'est ce que je voulais dire. J'ai édité la question. –

+1

Veuillez fournir ici l'exemple de code correspondant. –

Répondre

1

Vous devez ajouter les balises xml à y notre interface{}, c'est à dire.

Content interface{} `xml:"http://e-conomic.com Debtor_GetNameResponse"` 

Address interface{} dans l'autre exemple fonctionne parce que son nom est le même de la balise xml <Address></Address> et Unmarshal par ce lookups.

+0

Vous avez raison. Man je n'aime vraiment pas la manipulation de xml dans aller. –