dpg78570 2017-06-23 13:24
浏览 97
已采纳

在Golang中解组为实例化的空接口

I am trying to unmarshall into a variable of the empty go interface type. The concrete type has proper xml tags, but for some reason i cannot unmarshall the xml values. They just turn up empty.

This code does what I want to do:

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

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

But in my own example with actual xml with namespaces it doesn't work:

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

Full code: https://play.golang.org/p/AsV1LGW1lR

  • 写回答

1条回答 默认 最新

  • dongpu6141 2017-06-23 14:04
    关注

    You need to add the xml tags to your interface{}, ie.

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

    Address interface{} in your other example works because its name is the same of the xml tag <Address></Address> and Unmarshal lookups by it.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。