1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
// https://www.reddit.com/r/golang/comments/9eclgy/xml_unmarshaling_internal_references/
package main
import (
"fmt"
"github.com/clbanning/mxj/v2"
)
var data = []byte(`<app>
<users>
<user id="1" name="Jeff" />
<user id="2" name="Sally" />
</users>
<messages>
<message id="1" from_user="1" to_user="2">Hello!!</message>
</messages>
</app>`)
func main() {
m, err := mxj.NewMapXml(data)
if err != nil {
fmt.Println("err:", err)
return
}
fmt.Printf("%v\n", m)
type mystruct struct {
FromUser string
ToUser string
Message string
}
myStruct := mystruct{}
vals, err := m.ValuesForPath("app.users.user", "-id:1")
if err != nil {
fmt.Println("err:", err)
return
}
if len(vals) == 1 {
myStruct.FromUser = vals[0].(map[string]interface{})["-name"].(string)
}
vals, err = m.ValuesForPath("app.users.user", "-id:2")
if err != nil {
fmt.Println("err:", err)
return
}
if len(vals) == 1 {
myStruct.ToUser = vals[0].(map[string]interface{})["-name"].(string)
}
vals, err = m.ValuesForPath("app.messages.message.#text")
if err != nil {
fmt.Println("err:", err)
return
}
if len(vals) == 1 {
myStruct.Message = vals[0].(string)
}
fmt.Printf("%#v\n", myStruct)
}
|