there!
I'm parsing xml document and unmarshal it's contents to the struct, but it returns only last item from the list instead of full list.
The list is serverList
and after unmarshalling it returns only last server
instance. Need help.
func main() {
xmlFile := `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<operationGetServerList>
<returnCode>0</returnCode>
<message></message>
<serverList>
<server>
<serverId>1</serverId>
<nauServer>Main</nauServer>
<serverIp>1.1.1.1</serverIp>
<serverPort>8080</serverPort>
<serverPortFtp>25</serverPortFtp>
<serverHome>true</serverHome>
<serverIsOnline>true</serverIsOnline>
</server>
<server>
<serverId>2</serverId>
<nauServer>Reg1</nauServer>
<serverIp>1.1.1.2</serverIp>
<serverPort>8080</serverPort>
<serverPortFtp>25</serverPortFtp>
<serverHome>false</serverHome>
<serverIsOnline>false</serverIsOnline>
</server>
</serverList>
</operationGetServerList>`
type serverInfo struct {
ServerID string `xml:"serverId"`
NauServer string `xml:"nauServer"`
ServerIP string `xml:"serverIp"`
ServerPort int `xml:"serverPort"`
ServerPortFtp int `xml:"serverPortFtp"`
ServerHome bool `xml:"serverHome"`
ServerIsOnline bool `xml:"serverIsOnline"`
}
type serverInstance struct {
Server serverInfo `xml:"server"`
}
type operationGetServerListResponce struct {
ReturnCode int `xml:"returnCode"`
Message string `xml:"message"`
ServerList []serverInstance `xml:"serverList"`
}
var sL operationGetServerListResponce
err := xml.Unmarshal([]byte(xmlFile), &sL)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v", sL)
}
Prints:
{ReturnCode:0 Message: ServerList:[{Server:{ServerID:4 NauServer:Res2 ServerIP:1.1.1.4 ServerPort:8080 ServerPortFtp:25 ServerHome:false ServerIsOnline:true}}]}
The XML does not have a list of ServerList
, instead ServerList
contains a list of Server
.
You need to change your structs to the following:
type serverInstance struct {
Server []serverInfo `xml:"server"`
}
type operationGetServerListResponce struct {
ReturnCode int `xml:"returnCode"`
Message string `xml:"message"`
ServerList serverInstance `xml:"serverList"`
}
This will properly output all servers:
{ReturnCode:0 Message: ServerList:{Server:[{ServerID:1 NauServer:Main
ServerIP:1.1.1.1 ServerPort:8080 ServerPortFtp:25 ServerHome:true
ServerIsOnline:true} {ServerID:2 NauServer:Reg1 ServerIP:1.1.1.2
ServerPort:8080 ServerPortFtp:25 ServerHome:false
ServerIsOnline:false} {ServerID:3 NauServer:Res1 ServerIP:1.1.1.3
ServerPort:8080 ServerPortFtp:25 ServerHome:false
ServerIsOnline:false} {ServerID:4 NauServer:Res2 ServerIP:1.1.1.4
ServerPort:8080 ServerPortFtp:25 ServerHome:false
ServerIsOnline:true}]}}