func (xmlNode *XmlNode) Search(data interface{}) (result []Node, err error) { switch data := data.(type) { default: err = ERR_UNDEFINED_SEARCH_PARAM case string: if xpathExpr := xpath.Compile(data); xpathExpr != nil { defer xpathExpr.Free() result, err = xmlNode.Search(xpathExpr) } else { err = errors.New("cannot compile xpath: " + data) } case []byte: result, err = xmlNode.Search(string(data)) case *xpath.Expression: xpathCtx := xmlNode.Document.DocXPathCtx() nodePtrs, err := xpathCtx.Evaluate(unsafe.Pointer(xmlNode.Ptr), data) if nodePtrs == nil || err != nil { return nil, err } for _, nodePtr := range nodePtrs { result = append(result, NewNode(nodePtr, xmlNode.Document)) } } return }
func (ctx *EngineContext) GetXpathExpr(p string) (e *xpath.Expression) { object, err := ctx.XPathCache.Get(p) if err != nil { e = xpath.Compile(p) if e != nil { //ctx.AddMemoryObject(e) ctx.XPathCache.Set(p, &XpathExpObject{Expression: e}) } else { ctx.Debugger.LogTritiumErrorMessage(ctx.Customer, ctx.Project, ctx.Env, ctx.MessagePath, "Invalid XPath used: "+p) } return e } return object.(*XpathExpObject).Expression }