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)
}
答案 0 :(得分:0)
自我推销:https://github.com/kylewolfe/simplexml(正在开发中,但我已将其用于一些项目)。此外,这有助于您了解进/出的内容:https://github.com/ernesto-jimenez/httplogger
您打印的是一个空结构(具有默认值),无法正确解组,很可能是由于命名空间问题。