2017-06-23 9 views
1

空のgoインターフェイスタイプの変数にアンマーシャリングしようとしています。具体的な型は適切なxmlタグを持っていますが、何らかの理由でXML値をアンマーシャリングできません。彼らはただ空になる。ゴランのインスタンス化された空のインターフェイスへのアンマーシャリング

このコードは、私が何をしたいん:

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"}} 
} 

全コード:https://play.golang.org/p/QXyoOPMFZr

しかし、名前空間と実際のXMLと私自身の例では、それは動作しません。

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":""} 
} 

フルコード:https://play.golang.org/p/AsV1LGW1lR

+0

インターフェイスをインスタンス化することはできません。具体的な型のインスタンスを保持するインターフェイス型の変数のみを持つことができます。 – Adrian

+0

@Adrian、それは私が言ったことです。私は質問を編集しました。 –

+1

関連するコード例をここに入力してください。 –

答えて

1

xmlタグをyに追加する必要があります我々のinterface{}、すなわち。

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

Address interface{}あなたの他の例では、その名前は、それによってXMLタグ<Address></Address>Unmarshal検索のと同じであるので、動作します。

+0

あなたは正しいです。私は実際にXML処理を行っていません。 –

関連する問題