You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言xml.Unmarshal仅解析列表最后一项问题求助

解决XML反序列化时仅返回最后一个Server实例的问题

我帮你排查了代码,问题出在结构体的嵌套逻辑和XML标签映射上。你的operationGetServerListResponce结构体里,ServerList被定义为[]serverInstance切片,而serverInstance又嵌套了serverInfo类型的Server字段,这和XML的实际结构不匹配。

先看你的XML结构:

<operationGetServerList>
  <serverList>
    <server>...</server>
    <server>...</server>
  </serverList>
</operationGetServerList>

你的代码把serverList映射到切片后,切片里的每个serverInstance的Server字段标签是xml:"server",这会导致解析器把serverList下的所有server节点重复赋值给同一个serverInstance的Server字段,最后自然只留下最后一个实例。

修复方案

你不需要额外的serverInstance结构体,直接把ServerList定义为[]serverInfo类型,并调整XML标签为xml:"serverList>server",这样解析器就能正确识别serverList下的所有server节点,逐个解析到切片中。

修改后的完整代码:

package main

import (
	"encoding/xml"
	"fmt"
	"log"
)

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 operationGetServerListResponce struct {
		ReturnCode int         `xml:"returnCode"`
		Message    string      `xml:"message"`
		ServerList []serverInfo `xml:"serverList>server"` // 关键修改处
	}

	var sL operationGetServerListResponce
	err := xml.Unmarshal([]byte(xmlFile), &sL)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v", sL)
}

输出结果

运行修改后的代码,就能得到完整的Server列表:

{ReturnCode:0 Message: ServerList:[{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}]}

补充说明

xml:"serverList>server"标签的含义是:解析当前结构体下,serverList节点内部的所有server节点,将它们作为切片的元素。这完美匹配了XML的层级结构,避免了重复赋值覆盖的问题。

内容的提问来源于stack exchange,提问作者TheROX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:21