File: xmlele.go

package info (click to toggle)
golang-github-christrenkamp-goxpath 1.0~alpha3%2Bgit20170922.c385f95-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 308 kB
  • sloc: sh: 16; makefile: 3; xml: 3
file content (106 lines) | stat: -rw-r--r-- 2,647 bytes parent folder | download | duplicates (2)
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
package xmlele

import (
	"encoding/xml"

	"github.com/ChrisTrenkamp/goxpath/tree"
	"github.com/ChrisTrenkamp/goxpath/tree/xmltree/xmlbuilder"
	"github.com/ChrisTrenkamp/goxpath/tree/xmltree/xmlnode"
)

//XMLEle is an implementation of XPRes for XML elements
type XMLEle struct {
	xml.StartElement
	tree.NSBuilder
	Attrs    []tree.Node
	Children []tree.Node
	Parent   tree.Elem
	tree.NodePos
	tree.NodeType
}

//Root is the default root node builder for xmltree.ParseXML
func Root() xmlbuilder.XMLBuilder {
	return &XMLEle{NodeType: tree.NtRoot}
}

//CreateNode is an implementation of xmlbuilder.XMLBuilder.  It appends the node
//specified in opts and returns the child if it is an element.  Otherwise, it returns x.
func (x *XMLEle) CreateNode(opts *xmlbuilder.BuilderOpts) xmlbuilder.XMLBuilder {
	if opts.NodeType == tree.NtElem {
		ele := &XMLEle{
			StartElement: opts.Tok.(xml.StartElement),
			NSBuilder:    tree.NSBuilder{NS: opts.NS},
			Attrs:        make([]tree.Node, len(opts.Attrs)),
			Parent:       x,
			NodePos:      tree.NodePos(opts.NodePos),
			NodeType:     opts.NodeType,
		}
		for i := range opts.Attrs {
			ele.Attrs[i] = xmlnode.XMLNode{
				Token:    opts.Attrs[i],
				NodePos:  tree.NodePos(opts.AttrStartPos + i),
				NodeType: tree.NtAttr,
				Parent:   ele,
			}
		}
		x.Children = append(x.Children, ele)
		return ele
	}

	node := xmlnode.XMLNode{
		Token:    opts.Tok,
		NodePos:  tree.NodePos(opts.NodePos),
		NodeType: opts.NodeType,
		Parent:   x,
	}
	x.Children = append(x.Children, node)
	return x
}

//EndElem is an implementation of xmlbuilder.XMLBuilder.  It returns x's parent.
func (x *XMLEle) EndElem() xmlbuilder.XMLBuilder {
	return x.Parent.(*XMLEle)
}

//GetToken returns the xml.Token representation of the node
func (x *XMLEle) GetToken() xml.Token {
	return x.StartElement
}

//GetParent returns the parent node, or itself if it's the root
func (x *XMLEle) GetParent() tree.Elem {
	return x.Parent
}

//GetChildren returns all child nodes of the element
func (x *XMLEle) GetChildren() []tree.Node {
	ret := make([]tree.Node, len(x.Children))

	for i := range x.Children {
		ret[i] = x.Children[i]
	}

	return ret
}

//GetAttrs returns all attributes of the element
func (x *XMLEle) GetAttrs() []tree.Node {
	ret := make([]tree.Node, len(x.Attrs))
	for i := range x.Attrs {
		ret[i] = x.Attrs[i]
	}
	return ret
}

//ResValue returns the string value of the element and children
func (x *XMLEle) ResValue() string {
	ret := ""
	for i := range x.Children {
		switch x.Children[i].GetNodeType() {
		case tree.NtChd, tree.NtElem, tree.NtRoot:
			ret += x.Children[i].ResValue()
		}
	}
	return ret
}