...
1
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
47 vals, err := m.ValuesForKey("first-name")
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
87
88
89 vals, err = m.ValuesForPath("author.last-name")
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