Class: Nokogiri::XML::XPathContext
- Inherits:
-
Object
- Object
- Nokogiri::XML::XPathContext
- Defined in:
- lib/nokogiri/xml/xpath_context.rb,
ext/nokogiri/xml_xpath_context.c
Class Method Summary collapse
-
.new(node) ⇒ Object
Create a new XPathContext with
node
as the reference point.
Instance Method Summary collapse
-
#evaluate(search_path, handler = nil) ⇒ Object
Evaluate the
search_path
returning an XML::XPath object. -
#register_namespaces(namespaces) ⇒ Object
Register namespaces in
namespaces
. -
#register_ns(prefix, uri) ⇒ Object
Register the namespace with
prefix
anduri
. -
#register_variable(name, value) ⇒ Object
Register the variable
name
withvalue
.
Class Method Details
.new(node) ⇒ Object
Create a new XPathContext with node
as the reference point.
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 |
# File 'ext/nokogiri/xml_xpath_context.c', line 367
static VALUE
new (VALUE klass, VALUE nodeobj)
{
xmlNodePtr node;
xmlXPathContextPtr ctx;
VALUE self;
Noko_Node_Get_Struct(nodeobj, xmlNode, node);
xmlXPathInit();
ctx = xmlXPathNewContext(node->doc);
ctx->node = node;
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, deallocate, ctx);
return self;
}
|
Instance Method Details
#evaluate(search_path, handler = nil) ⇒ Object
Evaluate the search_path
returning an XML::XPath object.
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 |
# File 'ext/nokogiri/xml_xpath_context.c', line 312
static VALUE
evaluate(int argc, VALUE *argv, VALUE self)
{
VALUE search_path, xpath_handler;
VALUE retval = Qnil;
xmlXPathContextPtr ctx;
xmlXPathObjectPtr xpath;
xmlChar *query;
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, lookup, (void *)xpath_handler);
}
xmlResetLastError();
xmlSetStructuredErrorFunc(NULL, Nokogiri_error_raise);
/* For some reason, xmlXPathEvalExpression will blow up with a generic error */
/* when there is a non existent function. */
xmlSetGenericErrorFunc(NULL, xpath_generic_exception_handler);
xpath = xmlXPathEvalExpression(query, ctx);
xmlSetStructuredErrorFunc(NULL, NULL);
xmlSetGenericErrorFunc(NULL, NULL);
if (xpath == NULL) {
xmlErrorPtr error = xmlGetLastError();
rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
}
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) ⇒ Object
Register namespaces in namespaces
8 9 10 11 12 13 |
# 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) ⇒ Object
Register the namespace with prefix
and uri
.
115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'ext/nokogiri/xml_xpath_context.c', line 115
static VALUE
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) ⇒ Object
Register the variable name
with value
.
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'ext/nokogiri/xml_xpath_context.c', line 134
static VALUE
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;
}
|