...

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

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

     1  /* gonuts10.go - https://groups.google.com/forum/?fromgroups#!topic/golang-nuts/tf4aDQ1Hn_c
     2  change:
     3  <author>
     4      <first-name effect_range="1999-2011">Sam</first-name>
     5      <first-name effect_range="2012-">Kevin</first-name>
     6      <last-name>Smith</last-name>
     7     <full-name></full-name>
     8  </author>
     9  
    10  to:
    11  <author>
    12       <first-name effect_range="1999-2011">Sam</first-name>
    13      <first-name effect_range="2012-">Kevin</first-name>
    14      <last-name>Smith</last-name>
    15     <full-name>Kevin Smith</full-name>
    16  </author>
    17  
    18  NOTE: sequence of elements NOT guaranteed due to use of map[string]interface{}.
    19  
    20  Here we build the "full-name" element value from other values in the doc by selecting the
    21  "first-name" value with the latest dates.
    22  */
    23  
    24  package main
    25  
    26  import (
    27  	"fmt"
    28  	"github.com/clbanning/mxj"
    29  )
    30  
    31  var data = []byte(`
    32  <author>
    33      <first-name effect_range="1999-2011">Sam</first-name>
    34      <first-name effect_range="2012-">Kevin</first-name>
    35      <last-name>Smith</last-name>
    36     <full-name></full-name>
    37  </author>
    38  `)
    39  
    40  func main() {
    41  	m, err := mxj.NewMapXml(data)
    42  	if err != nil {
    43  		fmt.Println("NewMapXml err:", err)
    44  		return
    45  	}
    46  	// vals, err := m.ValuesForPath("author.first-name") // full-path option
    47  	vals, err := m.ValuesForKey("first-name") // key-only alternatively
    48  	if err != nil {
    49  		fmt.Println("ValuesForPath err:", err)
    50  		return
    51  	} else if len(vals) == 0 {
    52  		fmt.Println("no first-name vals")
    53  		return
    54  	}
    55  	var fname, date string
    56  	for _, v := range vals {
    57  		vm, ok := v.(map[string]interface{})
    58  		if !ok {
    59  			fmt.Println("assertion failed")
    60  			return
    61  		}
    62  		fn, ok := vm["#text"].(string)
    63  		if !ok {
    64  			fmt.Println("no #text tag")
    65  			return
    66  		}
    67  		dt, ok := vm["-effect_range"].(string)
    68  		if !ok {
    69  			fmt.Println("no -effect_range attr")
    70  			return
    71  		}
    72  		if dt > date {
    73  			date = dt
    74  			fname = fn
    75  		}
    76  	}
    77  	/*
    78  		// alternatively:
    79  		//(however, this requires knowing what latest "effect_range" attribute value is)
    80  		vals, err := m.ValuesForKey("first-name", "-effect_range:2012-")
    81  		if len(vals) == 0 {
    82  			fmt.Println("no #text vals")
    83  			return
    84  		}
    85  		fname := vals[0].(map[string]interface{})["#text"].(string)
    86  	*/
    87  
    88  	// vals, err = m.ValuesForKey("last-name") // key-only option
    89  	vals, err = m.ValuesForPath("author.last-name") // full-path option
    90  	if err != nil {
    91  		fmt.Println("ValuesForPath err:", err)
    92  		return
    93  	} else if len(vals) == 0 {
    94  		fmt.Println("no last-name vals")
    95  		return
    96  	}
    97  	lname := vals[0].(string)
    98  	if err = m.SetValueForPath(fname+" "+lname, "author.full-name"); err != nil {
    99  		fmt.Println("SetValueForPath err:", err)
   100  		return
   101  	}
   102  	b, err := m.XmlIndent("", "  ")
   103  	if err != nil {
   104  		fmt.Println("XmlIndent err:", err)
   105  		return
   106  	}
   107  	fmt.Println(string(b))
   108  }
   109  

View as plain text