...

Source file src/github.com/clbanning/mxj/v2/examples/gonuts10seq.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: use NewMapXmlSeq() and mv.XmlSeqIndent() to preserve structure.
    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  	"strings"
    30  )
    31  
    32  var data = []byte(`
    33  <author>
    34      <first-name effect_range="1999-2011">Sam</first-name>
    35      <first-name effect_range="2012-">Kevin</first-name>
    36      <last-name>Smith</last-name>
    37     <full-name></full-name>
    38  </author>
    39  `)
    40  
    41  func main() {
    42  	fmt.Println(string(data))
    43  	m, err := mxj.NewMapXmlSeq(data)
    44  	if err != nil {
    45  		fmt.Println("NewMapXml err:", err)
    46  		return
    47  	}
    48  	vals, err := m.ValuesForPath("author.first-name") // full-path option
    49  	if err != nil {
    50  		fmt.Println("ValuesForPath err:", err)
    51  		return
    52  	} else if len(vals) == 0 {
    53  		fmt.Println("no first-name vals")
    54  		return
    55  	}
    56  	var fname, date string
    57  	var index int
    58  	for _, v := range vals {
    59  		vm, ok := v.(map[string]interface{})
    60  		if !ok {
    61  			fmt.Println("assertion failed")
    62  			return
    63  		}
    64  		fn, ok := vm["#text"].(string)
    65  		if !ok {
    66  			fmt.Println("no #text tag")
    67  			return
    68  		}
    69  		// extract the associated date
    70  		dt, _ := mxj.Map(vm).ValueForPathString("#attr.effect_range.#text")
    71  		if dt == "" {
    72  			fmt.Println("no effect_range attr")
    73  			return
    74  		}
    75  		dts := strings.Split(dt, "-")
    76  		if len(dts) > 1 && dts[len(dts)-1] == "" {
    77  			index = len(dts) - 2
    78  		} else if len(dts) > 0 {
    79  			index = len(dts) - 1
    80  		}
    81  		if len(dts) > 0 && dts[index] > date {
    82  			date = dts[index]
    83  			fname = fn
    84  		}
    85  	}
    86  
    87  	vals, err = m.ValuesForPath("author.last-name.#text") // full-path option
    88  	if err != nil {
    89  		fmt.Println("ValuesForPath err:", err)
    90  		return
    91  	} else if len(vals) == 0 {
    92  		fmt.Println("no last-name vals")
    93  		return
    94  	}
    95  	lname := vals[0].(string)
    96  	if err = m.SetValueForPath(fname+" "+lname, "author.full-name.#text"); err != nil {
    97  		fmt.Println("SetValueForPath err:", err)
    98  		return
    99  	}
   100  	b, err := m.XmlSeqIndent("", "  ")
   101  	if err != nil {
   102  		fmt.Println("XmlIndent err:", err)
   103  		return
   104  	}
   105  	fmt.Println(string(b))
   106  }
   107  

View as plain text