107 lines
2.6 KiB
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
|
|
}
|