forked from ortuman/jackal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelement_set.go
138 lines (116 loc) · 2.86 KB
/
element_set.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
* Copyright (c) 2018 Miguel Ángel Ortuño.
* See the LICENSE file for more information.
*/
package xml
import (
"encoding/gob"
)
// ElementSet interface represents a read-only set of XML sub elements.
type ElementSet interface {
// Children returns all elements identified by name.
// Returns an empty array if no elements are found.
Children(name string) []XElement
// Child returns first element identified by name.
// Returns nil if no element is found.
Child(name string) XElement
// ChildrenNamespace returns all elements identified by name and namespace.
// Returns an empty array if no elements are found.
ChildrenNamespace(name, namespace string) []XElement
// ChildNamespace returns first element identified by name and namespace.
// Returns nil if no element is found.
ChildNamespace(name, namespace string) XElement
// All returns a list of all child nodes.
All() []XElement
// Count returns child elements count.
Count() int
}
type elementSet []XElement
func (es elementSet) Children(name string) []XElement {
var ret []XElement
for _, node := range es {
if node.Name() == name {
ret = append(ret, node)
}
}
return ret
}
func (es elementSet) Child(name string) XElement {
for _, node := range es {
if node.Name() == name {
return node
}
}
return nil
}
func (es elementSet) ChildrenNamespace(name string, namespace string) []XElement {
var ret []XElement
for _, node := range es {
if node.Name() == name && node.Namespace() == namespace {
ret = append(ret, node)
}
}
return ret
}
func (es elementSet) ChildNamespace(name string, namespace string) XElement {
for _, node := range es {
if node.Name() == name && node.Namespace() == namespace {
return node
}
}
return nil
}
func (es elementSet) All() []XElement {
return es
}
func (es elementSet) Count() int {
return len(es)
}
func (es *elementSet) append(nodes ...XElement) {
*es = append(*es, nodes...)
}
func (es *elementSet) remove(name string) {
filtered := (*es)[:0]
for _, node := range *es {
if node.Name() != name {
filtered = append(filtered, node)
}
}
*es = filtered
}
func (es *elementSet) removeNamespace(name string, namespace string) {
filtered := (*es)[:0]
for _, elem := range *es {
if elem.Name() != name || elem.Attributes().Get("xmlns") != namespace {
filtered = append(filtered, elem)
}
}
*es = filtered
}
func (es *elementSet) clear() {
*es = nil
}
func (es *elementSet) copyFrom(from elementSet) {
set := make([]XElement, from.Count())
for i := 0; i < len(from); i++ {
set[i] = NewElementFromElement(from[i])
}
*es = set
}
func (es *elementSet) fromGob(dec *gob.Decoder) {
var c int
dec.Decode(&c)
set := make([]XElement, c)
for i := 0; i < c; i++ {
var e Element
e.FromGob(dec)
set[i] = &e
}
*es = set
}
func (es elementSet) toGob(enc *gob.Encoder) {
enc.Encode(len(es))
for _, el := range es {
el.ToGob(enc)
}
}