73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package xpath
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/antchfx/xmlquery"
|
|
path "github.com/antchfx/xpath"
|
|
)
|
|
|
|
type xmlDocument struct{}
|
|
|
|
func (*xmlDocument) Parse(buf []byte) (dataNode, error) {
|
|
return xmlquery.Parse(strings.NewReader(string(buf)))
|
|
}
|
|
|
|
func (*xmlDocument) QueryAll(node dataNode, expr string) ([]dataNode, error) {
|
|
// If this panics it's a programming error as we changed the document type while processing
|
|
native, err := xmlquery.QueryAll(node.(*xmlquery.Node), expr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
nodes := make([]dataNode, 0, len(native))
|
|
for _, n := range native {
|
|
nodes = append(nodes, n)
|
|
}
|
|
return nodes, nil
|
|
}
|
|
|
|
func (*xmlDocument) CreateXPathNavigator(node dataNode) path.NodeNavigator {
|
|
// If this panics it's a programming error as we changed the document type while processing
|
|
return xmlquery.CreateXPathNavigator(node.(*xmlquery.Node))
|
|
}
|
|
|
|
func (d *xmlDocument) GetNodePath(node, relativeTo dataNode, sep string) string {
|
|
names := make([]string, 0)
|
|
|
|
// If these panic it's a programming error as we changed the document type while processing
|
|
nativeNode := node.(*xmlquery.Node)
|
|
nativeRelativeTo := relativeTo.(*xmlquery.Node)
|
|
|
|
// Climb up the tree and collect the node names
|
|
n := nativeNode.Parent
|
|
for n != nil && n != nativeRelativeTo {
|
|
nodeName := d.GetNodeName(n, sep, false)
|
|
names = append(names, nodeName)
|
|
n = n.Parent
|
|
}
|
|
|
|
if len(names) < 1 {
|
|
return ""
|
|
}
|
|
|
|
// Construct the nodes
|
|
nodepath := ""
|
|
for _, name := range names {
|
|
nodepath = name + sep + nodepath
|
|
}
|
|
|
|
return nodepath[:len(nodepath)-1]
|
|
}
|
|
|
|
func (*xmlDocument) GetNodeName(node dataNode, _ string, _ bool) string {
|
|
// If this panics it's a programming error as we changed the document type while processing
|
|
nativeNode := node.(*xmlquery.Node)
|
|
|
|
return nativeNode.Data
|
|
}
|
|
|
|
func (*xmlDocument) OutputXML(node dataNode) string {
|
|
native := node.(*xmlquery.Node)
|
|
return native.OutputXML(false)
|
|
}
|