terraform/vendor/github.com/ChrisTrenkamp/goxpath/tree/xmltree/xmlele/xmlele.go

107 lines
2.6 KiB
Go

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
}