class Nokogiri::XML::XPathContext
XPathContext
is the entry point for searching a Document
by using XPath
.
Public Class Methods
new(node)
click to toggle source
Create a new XPathContext
with node
as the reference point.
static VALUE rb_xml_xpath_context_new(VALUE klass, VALUE nodeobj) { xmlNodePtr node; xmlXPathContextPtr ctx; VALUE self; Noko_Node_Get_Struct(nodeobj, xmlNode, node); #if LIBXML_VERSION < 21000 /* deprecated in 40483d0 */ xmlXPathInit(); #endif ctx = xmlXPathNewContext(node->doc); ctx->node = node; xmlXPathRegisterNs(ctx, NOKOGIRI_PREFIX, NOKOGIRI_URI); xmlXPathRegisterNs(ctx, NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI); xmlXPathRegisterFuncNS(ctx, (const xmlChar *)"css-class", NOKOGIRI_BUILTIN_URI, xpath_builtin_css_class); xmlXPathRegisterFuncNS(ctx, (const xmlChar *)"local-name-is", NOKOGIRI_BUILTIN_URI, xpath_builtin_local_name_is); self = Data_Wrap_Struct(klass, 0, xml_xpath_context_deallocate, ctx); return self; }
Public Instance Methods
evaluate(search_path, handler = nil)
click to toggle source
Evaluate the search_path
returning an XML::XPath
object.
static VALUE rb_xml_xpath_context_evaluate(int argc, VALUE *argv, VALUE self) { VALUE search_path, xpath_handler; VALUE retval = Qnil; xmlXPathContextPtr ctx; xmlXPathObjectPtr xpath; xmlChar *query; VALUE errors = rb_ary_new(); Data_Get_Struct(self, xmlXPathContext, ctx); if (rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1) { xpath_handler = Qnil; } query = (xmlChar *)StringValueCStr(search_path); if (Qnil != xpath_handler) { /* FIXME: not sure if this is the correct place to shove private data. */ ctx->userData = (void *)xpath_handler; xmlXPathRegisterFuncLookup(ctx, handler_lookup, (void *)xpath_handler); } xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher); xmlSetGenericErrorFunc((void *)errors, generic_exception_pusher); xpath = xmlXPathEvalExpression(query, ctx); xmlSetStructuredErrorFunc(NULL, NULL); xmlSetGenericErrorFunc(NULL, NULL); if (xpath == NULL) { rb_exc_raise(rb_ary_entry(errors, 0)); } retval = xpath2ruby(xpath, ctx); if (retval == Qundef) { retval = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(ctx->doc)); } xmlXPathFreeNodeSetList(xpath); return retval; }
register_namespaces(namespaces)
click to toggle source
Register namespaces in namespaces
# File lib/nokogiri/xml/xpath_context.rb, line 8 def register_namespaces(namespaces) namespaces.each do |k, v| k = k.to_s.gsub(/.*:/, "") # strip off 'xmlns:' or 'xml:' register_ns(k, v) end end
register_ns(prefix, uri)
click to toggle source
Register the namespace with prefix
and uri
.
static VALUE rb_xml_xpath_context_register_ns(VALUE self, VALUE prefix, VALUE uri) { xmlXPathContextPtr ctx; Data_Get_Struct(self, xmlXPathContext, ctx); xmlXPathRegisterNs(ctx, (const xmlChar *)StringValueCStr(prefix), (const xmlChar *)StringValueCStr(uri) ); return self; }
register_variable(name, value)
click to toggle source
Register the variable name
with value
.
static VALUE rb_xml_xpath_context_register_variable(VALUE self, VALUE name, VALUE value) { xmlXPathContextPtr ctx; xmlXPathObjectPtr xmlValue; Data_Get_Struct(self, xmlXPathContext, ctx); xmlValue = xmlXPathNewCString(StringValueCStr(value)); xmlXPathRegisterVariable(ctx, (const xmlChar *)StringValueCStr(name), xmlValue ); return self; }