File: gonuts5.go

package info (click to toggle)
golang-github-clbanning-mxj 2.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,200 kB
  • sloc: xml: 176; makefile: 4
file content (75 lines) | stat: -rw-r--r-- 1,944 bytes parent folder | download
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/v2"
)

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("int", "-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"])
	}
}