转到xml.Unmarshal仅获得列表的最后一项

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