In your case, you will have to fully describe the xml message in the structures, otherwise you will lose nodes in the resulting xml-le:
package main import ( "encoding/xml" "fmt" ) type Servers struct { XMLName xml.Name `xml:"servers"` Version int `xml:"version,attr"` Items []Server `xml:"server"` } type Server struct { ServerName string `xml:"serverName"` ServerIP string `xml:"serverIP"` } func main() { data := ` <servers version="1"> <server> <serverName>Shanghai_VPN</serverName> <serverIP>127.0.0.1</serverIP> </server> <server> <serverName>Beijing_VPN</serverName> <serverIP>127.0.0.2</serverIP> </server> </servers>` servers := Servers{ Items: []Server{}, } _ = xml.Unmarshal([]byte(data), &servers) for i := range servers.Items { fmt.Printf("%#v\n", servers.Items[i]) // Output 1 } for i := range servers.Items { servers.Items[i].ServerIP = fmt.Sprintf("test - %d", i) } resultXml, _ := xml.Marshal(servers) fmt.Print(string(resultXml)) // Output 2 }
Output 1:
main.Server{ServerName:"Shanghai_VPN", ServerIP:"127.0.0.1"} main.Server{ServerName:"Beijing_VPN", ServerIP:"127.0.0.2"}
Output 2:
<servers version="1"><server><serverName>Shanghai_VPN</serverName><serverIP>test - 0</serverIP></server><server><serverName>Beijing_VPN</serverName><serverIP>test - 1</serverIP></server></servers>