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
相关产品推荐
相关产品推荐

