W3cubDocs

/Nokogiri

class Nokogiri::XML::NodeSet

Parent:
Object
Included modules:
Nokogiri::XML::Searchable

A NodeSet contains a list of Nokogiri::XML::Node objects. Typically a NodeSet is return as a result of searching a Document via Nokogiri::XML::Searchable#css or Nokogiri::XML::Searchable#xpath

Attributes

document[RW]

The Document this NodeSet is associated with

Public Class Methods

new(document, list = []) { |self| ... } Show source
# File lib/nokogiri/xml/node_set.rb, line 17
def initialize document, list = []
  @document = document
  document.decorate(self)
  list.each { |x| self << x }
  yield self if block_given?
end

Create a NodeSet with document defaulting to list

Public Instance Methods

%(*args)
Alias for: at
&(node_set) Show source
static VALUE intersection(VALUE self, VALUE rb_other)
{
  xmlNodeSetPtr node_set, other ;
  xmlNodeSetPtr intersection;

  if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
    rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_other, xmlNodeSet, other);

  intersection = xmlXPathIntersection(node_set, other);
  return Nokogiri_wrap_xml_node_set(intersection, rb_iv_get(self, "@document"));
}

Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.

+(p1)
Alias for: |
-(node_set) Show source
static VALUE minus(VALUE self, VALUE rb_other)
{
  xmlNodeSetPtr node_set, other;
  xmlNodeSetPtr new;
  int j ;

  if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
    rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_other, xmlNodeSet, other);

  new = xmlXPathNodeSetMerge(NULL, node_set);
  for (j = 0 ; j < other->nodeNr ; ++j) {
    xpath_node_set_del(new, other->nodeTab[j]);
  }

  return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
}

Difference - returns a new NodeSet that is a copy of this NodeSet, removing each item that also appears in node_set

<<(p1)
Alias for: push
==(other) Show source
# File lib/nokogiri/xml/node_set.rb, line 293
def == other
  return false unless other.is_a?(Nokogiri::XML::NodeSet)
  return false unless length == other.length
  each_with_index do |node, i|
    return false unless node == other[i]
  end
  true
end

Equality – Two NodeSets are equal if the contain the same number of elements and if each element is equal to the corresponding element in the other NodeSet

>(selector) Show source
# File lib/nokogiri/xml/node_set.rb, line 105
def > selector
  ns = document.root.namespaces
  xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
end

Search this NodeSet's nodes' immediate children using CSS selector selector

[index] → Node or nil Show source
[start, length] → NodeSet or nil
[range] → NodeSet or nil
static VALUE slice(int argc, VALUE *argv, VALUE self)
{
  VALUE arg ;
  long beg, len ;
  xmlNodeSetPtr node_set;

  Data_Get_Struct(self, xmlNodeSet, node_set);

  if (argc == 2) {
    beg = NUM2LONG(argv[0]);
    len = NUM2LONG(argv[1]);
    if (beg < 0) {
      beg += node_set->nodeNr ;
    }
    return subseq(self, beg, len);
  }

  if (argc != 1) {
    rb_scan_args(argc, argv, "11", NULL, NULL);
  }
  arg = argv[0];

  if (FIXNUM_P(arg)) {
    return index_at(self, FIX2LONG(arg));
  }

  /* if arg is Range */
  switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
  case Qfalse:
    break;
  case Qnil:
    return Qnil;
  default:
    return subseq(self, beg, len);
  }

  return index_at(self, NUM2LONG(arg));
}

Element reference - returns the node at index, or returns a NodeSet containing nodes starting at start and continuing for length elements, or returns a NodeSet containing nodes specified by range. Negative indices count backward from the end of the node_set (-1 is the last node). Returns nil if the index (or start) are out of range.

add_class(name) Show source
# File lib/nokogiri/xml/node_set.rb, line 142
def add_class name
  each do |el|
    el.add_class(name)
  end
  self
end

Add the class attribute name to all Node objects in the NodeSet.

See Nokogiri::XML::Node#add_class for more information.

after(datum) Show source
# File lib/nokogiri/xml/node_set.rb, line 65
def after datum
  last.after datum
end

Insert datum after the last Node in this NodeSet

append_class(name) Show source
# File lib/nokogiri/xml/node_set.rb, line 154
def append_class name
  each do |el|
    el.append_class(name)
  end
  self
end

Append the class attribute name to all Node objects in the NodeSet.

See Nokogiri::XML::Node#append_class for more information.

search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] Show source
# File lib/nokogiri/xml/node_set.rb, line 122
def at *args
  if args.length == 1 && args.first.is_a?(Numeric)
    return self[args.first]
  end

  super(*args)
end

Search this object for paths, and return only the first result. paths must be one or more XPath or CSS queries.

See Nokogiri::XML::Searchable#search for more information.

Or, if passed an integer, index into the NodeSet:

node_set.at(3) # same as node_set[3]
Calls superclass method Nokogiri::XML::Searchable#at
Also aliased as: %
attr(key, value = nil, &blk) Show source
# File lib/nokogiri/xml/node_set.rb, line 176
def attr key, value = nil, &blk
  unless Hash === key || key && (value || blk)
    return first.attribute(key)
  end

  hash = key.is_a?(Hash) ? key : { key => value }

  hash.each { |k,v| each { |el| el[k] = v || blk[el] } }

  self
end

Set the attribute key to value or the return value of blk on all Node objects in the NodeSet.

Also aliased as: set, attribute
attribute(key, value = nil, &blk)
Alias for: attr
before(datum) Show source
# File lib/nokogiri/xml/node_set.rb, line 59
def before datum
  first.before datum
end

Insert datum before the first Node in this NodeSet

children() Show source
# File lib/nokogiri/xml/node_set.rb, line 305
def children
  node_set = NodeSet.new(document)
  each do |node|
    node.children.each { |n| node_set.push(n) }
  end
  node_set
end

Returns a new NodeSet containing all the children of all the nodes in the NodeSet

clone()
Alias for: dup
css *rules, [namespace-bindings, custom-pseudo-class] Show source
# File lib/nokogiri/xml/node_set.rb, line 79
def css *args
  rules, handler, ns, _ = extract_params(args)
  paths = css_rules_to_xpath(rules, ns)

  inject(NodeSet.new(document)) do |set, node|
    set + xpath_internal(node, paths, handler, ns, nil)
  end
end

Search this node set for CSS rules. rules must be one or more CSS selectors. For example:

For more information see Nokogiri::XML::Searchable#css

delete(node) Show source
static VALUE
delete(VALUE self, VALUE rb_node)
{
  xmlNodeSetPtr node_set;
  xmlNodePtr node;

  Check_Node_Set_Node_Type(rb_node);

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_node, xmlNode, node);

  if (xmlXPathNodeSetContains(node_set, node)) {
    xpath_node_set_del(node_set, node);
    return rb_node;
  }
  return Qnil ;
}

Delete node from the Nodeset, if it is a member. Returns the deleted node if found, otherwise returns nil.

static VALUE duplicate(VALUE self)
{
  xmlNodeSetPtr node_set;
  xmlNodeSetPtr dupl;

  Data_Get_Struct(self, xmlNodeSet, node_set);

  dupl = xmlXPathNodeSetMerge(NULL, node_set);

  return Nokogiri_wrap_xml_node_set(dupl, rb_iv_get(self, "@document"));
}

Duplicate this NodeSet. Note that the Nodes contained in the NodeSet are not duplicated (similar to how Array and other Enumerable classes work).

Also aliased as: clone
each() { |self| ... } Show source
# File lib/nokogiri/xml/node_set.rb, line 200
def each(&block)
  return to_enum unless block_given?

  0.upto(length - 1) do |x|
    yield self[x]
  end
  self
end

Iterate over each node, yielding to block

empty?() Show source
# File lib/nokogiri/xml/node_set.rb, line 41
def empty?
  length == 0
end

Is this NodeSet empty?

filter(expr) Show source
# File lib/nokogiri/xml/node_set.rb, line 133
def filter expr
  find_all { |node| node.matches?(expr) }
end

Filter this list for nodes that match expr

first(n = nil) Show source
# File lib/nokogiri/xml/node_set.rb, line 26
def first n = nil
  return self[0] unless n
  list = []
  [n, length].min.times { |i| list << self[i] }
  list
end

Get the first element of the NodeSet.

include?(node) Show source
static VALUE include_eh(VALUE self, VALUE rb_node)
{
  xmlNodeSetPtr node_set;
  xmlNodePtr node;

  Check_Node_Set_Node_Type(rb_node);

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_node, xmlNode, node);

  return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
}

Returns true if any member of node set equals node.

index(node = nil) { |member| ... } Show source
# File lib/nokogiri/xml/node_set.rb, line 47
def index(node = nil, &block)
  if node
    warn "given block not used" if block_given?
    each_with_index { |member, j| return j if member == node }
  elsif block_given?
    each_with_index { |member, j| return j if yield(member) }
  end
  nil
end

Returns the index of the first node in self that is == to node or meets the given block. Returns nil if no match is found.

inner_html(*args) Show source
# File lib/nokogiri/xml/node_set.rb, line 229
def inner_html *args
  collect{|j| j.inner_html(*args) }.join('')
end

Get the inner html of all contained Node objects

inner_text() Show source
# File lib/nokogiri/xml/node_set.rb, line 222
def inner_text
  collect(&:inner_text).join('')
end

Get the inner text of all contained Node objects

Note: This joins the text of all Node objects in the NodeSet:

doc = Nokogiri::XML('<xml><a><d>foo</d><d>bar</d></a></xml>')
doc.css('d').text # => "foobar"

Instead, if you want to return the text of all nodes in the NodeSet:

doc.css('d').map(&:text) # => ["foo", "bar"]

See Nokogiri::XML::Node#content for more information.

Also aliased as: text
inspect() Show source
# File lib/nokogiri/xml/node_set.rb, line 326
def inspect
  "[#{map(&:inspect).join ', '}]"
end

Return a nicely formated string representation

last() Show source
# File lib/nokogiri/xml/node_set.rb, line 35
def last
  self[-1]
end

Get the last element of the NodeSet.

length Show source
static VALUE length(VALUE self)
{
  xmlNodeSetPtr node_set;

  Data_Get_Struct(self, xmlNodeSet, node_set);

  return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0);
}

Get the length of the node set

Also aliased as: size
pop() Show source
# File lib/nokogiri/xml/node_set.rb, line 276
def pop
  return nil if length == 0
  delete last
end

Removes the last element from set and returns it, or nil if the set is empty

push(node) Show source
static VALUE push(VALUE self, VALUE rb_node)
{
  xmlNodeSetPtr node_set;
  xmlNodePtr node;

  Check_Node_Set_Node_Type(rb_node);

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_node, xmlNode, node);

  xmlXPathNodeSetAdd(node_set, node);

  return self;
}

Append node to the NodeSet.

Also aliased as: <<
remove()
Alias for: unlink
remove_attr(name) Show source
# File lib/nokogiri/xml/node_set.rb, line 192
def remove_attr name
  each { |el| el.delete name }
  self
end

Remove the attributed named name from all Node objects in the NodeSet

Also aliased as: remove_attribute
remove_attribute(name)
Alias for: remove_attr
remove_class(name = nil) Show source
# File lib/nokogiri/xml/node_set.rb, line 166
def remove_class name = nil
  each do |el|
    el.remove_class(name)
  end
  self
end

Remove the class attribute name from all Node objects in the NodeSet.

See Nokogiri::XML::Node#remove_class for more information.

reverse() Show source
# File lib/nokogiri/xml/node_set.rb, line 316
def reverse
  node_set = NodeSet.new(document)
  (length - 1).downto(0) do |x|
    node_set.push self[x]
  end
  node_set
end

Returns a new NodeSet containing all the nodes in the NodeSet in reverse order

set(key, value = nil, &blk)
Alias for: attr
shift() Show source
# File lib/nokogiri/xml/node_set.rb, line 284
def shift
  return nil if length == 0
  delete first
end

Returns the first element of the NodeSet and removes it. Returns nil if the set is empty.

size()
Alias for: length
slice(index) → Node or nil Show source
slice(start, length) → NodeSet or nil
slice(range) → NodeSet or nil
static VALUE slice(int argc, VALUE *argv, VALUE self)
{
  VALUE arg ;
  long beg, len ;
  xmlNodeSetPtr node_set;

  Data_Get_Struct(self, xmlNodeSet, node_set);

  if (argc == 2) {
    beg = NUM2LONG(argv[0]);
    len = NUM2LONG(argv[1]);
    if (beg < 0) {
      beg += node_set->nodeNr ;
    }
    return subseq(self, beg, len);
  }

  if (argc != 1) {
    rb_scan_args(argc, argv, "11", NULL, NULL);
  }
  arg = argv[0];

  if (FIXNUM_P(arg)) {
    return index_at(self, FIX2LONG(arg));
  }

  /* if arg is Range */
  switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
  case Qfalse:
    break;
  case Qnil:
    return Qnil;
  default:
    return subseq(self, beg, len);
  }

  return index_at(self, NUM2LONG(arg));
}

Element reference - returns the node at index, or returns a NodeSet containing nodes starting at start and continuing for length elements, or returns a NodeSet containing nodes specified by range. Negative indices count backward from the end of the node_set (-1 is the last node). Returns nil if the index (or start) are out of range.

text()
Alias for: inner_text
static VALUE to_array(VALUE self, VALUE rb_node)
{
  xmlNodeSetPtr node_set ;
  VALUE list;
  int i;

  Data_Get_Struct(self, xmlNodeSet, node_set);

  list = rb_ary_new2(node_set->nodeNr);
  for(i = 0; i < node_set->nodeNr; i++) {
    VALUE elt = Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[i], self);
    rb_ary_push( list, elt );
  }

  return list;
}

Return this list as an Array

Also aliased as: to_ary
to_ary()
Alias for: to_a
to_html(*args) Show source
# File lib/nokogiri/xml/node_set.rb, line 247
def to_html *args
  if Nokogiri.jruby?
    options = args.first.is_a?(Hash) ? args.shift : {}
    if !options[:save_with]
      options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
    end
    args.insert(0, options)
  end
  map { |x| x.to_html(*args) }.join
end

Convert this NodeSet to HTML

to_s() Show source
# File lib/nokogiri/xml/node_set.rb, line 241
def to_s
  map(&:to_s).join
end

Convert this NodeSet to a string.

to_xhtml(*args) Show source
# File lib/nokogiri/xml/node_set.rb, line 260
def to_xhtml *args
  map { |x| x.to_xhtml(*args) }.join
end

Convert this NodeSet to XHTML

to_xml(*args) Show source
# File lib/nokogiri/xml/node_set.rb, line 266
def to_xml *args
  map { |x| x.to_xml(*args) }.join
end

Convert this NodeSet to XML

Unlink this NodeSet and all Node objects it contains from their current context.

Also aliased as: remove
wrap(html) Show source
# File lib/nokogiri/xml/node_set.rb, line 235
def wrap html
  map { |node| node.wrap html }
end

Wrap this NodeSet with html

xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class] Show source
# File lib/nokogiri/xml/node_set.rb, line 95
def xpath *args
  paths, handler, ns, binds = extract_params(args)

  inject(NodeSet.new(document)) do |set, node|
    set + xpath_internal(node, paths, handler, ns, binds)
  end
end

Search this node set for XPath paths. paths must be one or more XPath queries.

For more information see Nokogiri::XML::Searchable#xpath

|(node_set) Show source
static VALUE set_union(VALUE self, VALUE rb_other)
{
  xmlNodeSetPtr node_set, other;
  xmlNodeSetPtr new;

  if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
    rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");

  Data_Get_Struct(self, xmlNodeSet, node_set);
  Data_Get_Struct(rb_other, xmlNodeSet, other);

  new = xmlXPathNodeSetMerge(NULL, node_set);
  new = xmlXPathNodeSetMerge(new, other);

  return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
}

Returns a new set built by merging the set and the elements of the given set.

Also aliased as: +

© 2008–2018 Aaron Patterson, Mike Dalessio, Charles Nutter, Sergio Arbeo,
Patrick Mahoney, Yoko Harada, Akinori Musha, John Shahid, Lars Kanis
Licensed under the MIT License.