golang与SOAP

时间:2015-02-03 20:25:59

标签: xml parsing soap go

Bellow是代码

package main

import (
    "fmt"
    "encoding/xml"
)

type Return struct {
    RequestId int
    DataCenterId string
    DataCenterVersion int
    StorageId string
}

type StorageReturn struct{
    Ret  Return `xml:"return"`
}

type Body struct {
    StrgRet StorageReturn `xml:"ns:createStorageReturn"`
}

type StorageResponse struct{
    XMLName xml.Name
    RespBody Body `xml:"S:Body"`
}


func main(){
   s = `<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:createStorageReturn xmlns:ns2="http://ws.api.mysite.com/"><return><requestId>16660663</requestId><dataCenterId>ssrr-444tt-yy-99</dataCenterId><dataCenterVersion>12</dataCenterVersion><storageId>towrrt24903FR55405</storageId></return></ns2:createStorageReturn></S:Body></S:Envelope>`

    parser := xml.NewDecoder(bytes.NewBufferString(s))
    envelope := new(StorageResponse)
    err = parser.DecodeElement(&envelope, nil)
    if err != nil {
        fmt.Printf("Error in parsing")
        fmt.Printf("%v", err)
        return
    }
    fmt.Printf("%+v", envelope)
}

确实打印了这个---

{XMLName:{Space:http://schemas.xmlsoap.org/soap/envelope/ Local:Envelope} RespBody:{StrgRet:{Ret:{RequestId:0 DataCenterId:DataCenterVersion:0 StorageId:}}}}

不知道为什么。

我对xml解析不好,我不明白我做错了什么。为了进一步参考,我在这里提到这是我要解析的SOAP调用的响应。省略了呼叫和接收部分,因为它们工作正常并没有问题。问题只是解析返回XML。

请帮帮我。

提前致谢

根据悟空的要求。这是我上面发布的代码的工作版本

package main

import (
    "fmt"
    "encoding/xml"
)

type Return struct {
    RequestId int `xml:"requestId"`
    DataCenterId string `xml:"dataCenterId"`
    DataCenterVersion int `xml:"dataCenterVersion"`
    StorageId string `xml:"storageId"`
}

type StorageReturn struct{
    Ret  Return `xml:"return"`
}

type Body struct {
    StrgRet StorageReturn `xml:"createStorageReturn"`
}

type StorageResponse struct{
    XMLName xml.Name `xml:"Envelope"`
    RespBody Body `xml:"Body"`
}


func main(){
   s := `<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:createStorageReturn xmlns:ns2="http://ws.api.mysite.com/"><return><requestId>16660663</requestId><dataCenterId>ssrr-444tt-yy-99</dataCenterId><dataCenterVersion>12</dataCenterVersion><storageId>towrrt24903FR55405</storageId></return></ns2:createStorageReturn></S:Body></S:Envelope>`

    v := StorageResponse{}  
    err := xml.Unmarshal([]byte(s), &v)
    if err != nil{
        fmt.Println(err)
    }
    fmt.Printf("%+v", v)
}

1 个答案:

答案 0 :(得分:0)

自我推销:https://github.com/kylewolfe/simplexml(正在开发中,但我已将其用于一些项目)。此外,这有助于您了解进/出的内容:https://github.com/ernesto-jimenez/httplogger

您打印的是一个空结构(具有默认值),无法正确解组,很可能是由于命名空间问题。