You need to create two structs:
- one to represent the
<file>
</file>
- one for the repeating record
<person>
</person>
Please see the comments inside the code:
package main
import (
"encoding/xml"
"fmt"
)
var sourceXML = []byte(`<file>
<person>
<name>John Doe</name>
<age>18</age>
</person>
<person>
<name>Jane Doe</name>
<age>20</age>
</person>
</file>`)
type Person struct {
Name string `xml:"name"`
Age int `xml:"age"`
}
type File struct {
People []Person `xml:"person"`
}
func main() {
var file File
err := xml.Unmarshal(sourceXML, &file)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%+v", file.People)
}
Edit. Kaedys said the File and Person structures can also be nested (using anonymous structs) as follows:
type File struct {
People []struct {
Name string `xml:"name"`
Age int `xml:"age"`
} `xml:"person"`
}