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{}
val, err := m.ValueForKey("user", "-id:1")
if val != nil {
myStruct.FromUser = val.(map[string]interface{})["-name"].(string)
} else {
// if there no val, then err is at least KeyNotExistError
fmt.Println("err:", err)
return
}
val, err = m.ValueForKey("user", "-id:2")
if val != nil {
myStruct.ToUser = val.(map[string]interface{})["-name"].(string)
} else {
// if there no val, then err is at least KeyNotExistError
fmt.Println("err:", err)
return
}
val, err = m.ValueForKey("#text")
if val != nil {
myStruct.Message = val.(string)
} else {
// if there no val, then err is at least KeyNotExistError
fmt.Println("err:", err)
return
}
fmt.Printf("%#v\n", myStruct)
}
|