...
1
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")
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
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")
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