forked from clbanning/mxj
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gonuts5a.go
75 lines (67 loc) · 1.89 KB
/
gonuts5a.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// gonuts5.go - from https://groups.google.com/forum/#!topic/golang-nuts/MWoYY19of3o
// problem is to extract entries from <lst name="list3-1-1-1"></lst> by "int name="
package main
import (
"fmt"
"github.com/clbanning/mxj"
)
var xmlData = []byte(`<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="list1">
</lst>
<lst name="list2">
</lst>
<lst name="list3">
<int name="docId">1</int>
<lst name="list3-1">
<lst name="list3-1-1">
<lst name="list3-1-1-1">
<int name="field1">1</int>
<int name="field2">2</int>
<int name="field3">3</int>
<int name="field4">4</int>
<int name="field5">5</int>
</lst>
</lst>
<lst name="list3-1-2">
<lst name="list3-1-2-1">
<int name="field1">1</int>
<int name="field2">2</int>
<int name="field3">3</int>
<int name="field4">4</int>
<int name="field5">5</int>
</lst>
</lst>
</lst>
</lst>
</response>`)
func main() {
// parse XML into a Map
m, merr := mxj.NewMapXml(xmlData)
if merr != nil {
fmt.Println("merr:", merr.Error())
return
}
// extract the 'list3-1-1-1' node - there'll be just 1?
// NOTE: attribute keys are prepended with '-'
lstVal, lerr := m.ValuesForPath("*.*.*.*.*", "-name:list3-1-1-1")
if lerr != nil {
fmt.Println("ierr:", lerr.Error())
return
}
// assuming just one value returned - create a new Map
mv := mxj.Map(lstVal[0].(map[string]interface{}))
// extract the 'int' values by 'name' attribute: "-name"
// interate over list of 'name' values of interest
var names = []string{"field1", "field2", "field3", "field4", "field5"}
for _, n := range names {
vals, verr := mv.ValuesForKey("*", "-name:"+n)
if verr != nil {
fmt.Println("verr:", verr.Error(), len(vals))
return
}
// values for simple elements have key '#text'
// NOTE: there can be only one value for key '#text'
fmt.Println(n, ":", vals[0].(map[string]interface{})["#text"])
}
}