duandi8852752
2017-10-05 18:27
浏览 24
已采纳

在Go中解封SOAP响应

I am making a SOAP call to an API, Here is a sample response:

<?xml version="1.0" encoding="utf-8" ?>
 <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:body>
      <soapenv:fault>
        <faultcode>
          ERR109
        </faultcode>
        <faultstring>
          Account Expired. Result code is 2163
        </faultstring>
        <detail>
          <ns1:serviceexception xmlns:ns1="http://www.csapi.org/schema/parlayx/common/v2_1">
            <messageid>
              ERR109
            </messageid>
            <text>
              Account Expired. Result code is 2163
            </text>
            <variables>
              2163
            </variables>
          </ns1:serviceexception>
        </detail>
      </soapenv:fault>
    </soapenv:body>
  </soapenv:envelope>

To unmarshal this response, I have built some structs:

type SoapResponse struct {
    Body    ResponseBody `soapenv:"body"`
}
type ResponseBody struct {
    Fault   Fault    `soapenv:"fault"`
}
type Fault struct {
    FaultCode   string `xml:"faultcode"`
    FaultString string `xml:"faultstring"`
    Detail      Detail `xml:"detail"`
}
type Detail struct {
    ServiceException ServiceException `ns1:"serviceexception"`
}
type ServiceException struct {
    ID          string `xml:"messageid"` 
    MessageText string `xml:"text"`
    ErrorCode   string `xml:"variables"`
}

And here is the code that does the unmarshaling part:

responseBody, _:= ioutil.ReadAll(resp.Body)
var soapResponse = new(SoapResponse)
err := xml.Unmarshal(responseBody, soapResponse)
    if err != nil {
        panic("Error!")
    }

The problem is that all soapResponse properties are populated just right, except for soapResponse.Body.Fault.Detail.ServiceException.ID which prints nothing.
I couldn't figure out why. Any help would be appreciated.

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dtn51137 2017-10-05 20:10
    已采纳

    You may parse got XML with such structures:

    type SoapResponse struct {
        Body ResponseBody `xml:"soapenv body"`
    }
    type ResponseBody struct {
        Fault Fault `xml:"fault"`
    }
    type Fault struct {
        FaultCode   string `xml:"faultcode"`
        FaultString string `xml:"faultstring"`
        Detail      Detail `xml:"detail"`
    }
    type Detail struct {
        ServiceException ServiceException `xml:"serviceexception"`
    }
    type ServiceException struct {
        ID          string `xml:"messageid"`
        MessageText string `xml:"text"`
        ErrorCode   string `xml:"variables"`
    }
    

    I've added namespace for the first element and fixed some definitions. Working example - https://play.golang.org/p/vZQhaxYikX

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题