...

Source file src/github.com/clbanning/mxj/v2/examples/reddit01.go

Documentation: github.com/clbanning/mxj/v2/examples

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

View as plain text