duanchen7401 2018-01-22 10:50
浏览 45
已采纳

转到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}}]}
  • 写回答

1条回答 默认 最新

  • douya6229 2018-01-22 10:52
    关注

    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}]}}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c