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
# File lib/nokogiri/xml/node_set.rb, line 19 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
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 noko_xml_node_set_wrap(intersection, rb_iv_get(self, "@document")); }
Set Intersection — Returns a new NodeSet
containing nodes common to the two NodeSets.
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 noko_xml_node_set_wrap(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
# File lib/nokogiri/xml/node_set.rb, line 322 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
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.
# File lib/nokogiri/xml/node_set.rb, line 137 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.
# File lib/nokogiri/xml/node_set.rb, line 149 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.
# File lib/nokogiri/xml/node_set.rb, line 117 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 Searchable#search
for more information.
Or, if passed an integer, index into the NodeSet:
node_set.at(3) # same as node_set[3]
Nokogiri::XML::Searchable#at
# File lib/nokogiri/xml/node_set.rb, line 201 def attr(key, value = nil, &block) unless key.is_a?(Hash) || (key && (value || block)) return first ? first.attribute(key) : nil end hash = key.is_a?(Hash) ? key : { key => value } hash.each do |k, v| each do |node| node[k] = v || yield(node) end end self end
Set attributes on each Node
in the NodeSet
, or get an attribute from the first Node
in the NodeSet
.
To get an attribute from the first Node
in a NodeSet:
node_set.attr("href") # => "https://www.nokogiri.org"
Note that an empty NodeSet
will return nil when #attr
is called as a getter.
To set an attribute on each node, key
can either be an attribute name, or a Hash of attribute names and values. When called as a setter, #attr
returns the NodeSet
.
If key
is an attribute name, then either value
or block
must be passed.
If key
is a Hash then attributes will be set for each key/value pair:
node_set.attr("href" => "https://www.nokogiri.org", "class" => "member")
If value
is passed, it will be used as the attribute value for all nodes:
node_set.attr("href", "https://www.nokogiri.org")
If block
is passed, it will be called on each Node
object in the NodeSet
and the return value used as the attribute value for that node:
node_set.attr("class") { |node| node.name }
# File lib/nokogiri/xml/node_set.rb, line 81 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
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 noko_xml_node_set_wrap(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).
# File lib/nokogiri/xml/node_set.rb, line 229 def each 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
# File lib/nokogiri/xml/node_set.rb, line 43 def empty? length == 0 end
Is this NodeSet
empty?
# File lib/nokogiri/xml/node_set.rb, line 128 def filter(expr) find_all { |node| node.matches?(expr) } end
Filter this list for nodes that match expr
# File lib/nokogiri/xml/node_set.rb, line 28 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
.
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
.
# File lib/nokogiri/xml/node_set.rb, line 49 def index(node = nil) 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.
# File lib/nokogiri/xml/node_set.rb, line 258 def inner_html(*args) collect { |j| j.inner_html(*args) }.join("") end
Get the inner html of all contained Node
objects
# File lib/nokogiri/xml/node_set.rb, line 251 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.
# File lib/nokogiri/xml/node_set.rb, line 355 def inspect "[#{map(&:inspect).join(", ")}]" end
Return a nicely formated string representation
# File lib/nokogiri/xml/node_set.rb, line 37 def last self[-1] end
Get the last element of the NodeSet
.
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
# File lib/nokogiri/xml/node_set.rb, line 305 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
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
.
# File lib/nokogiri/xml/node_set.rb, line 221 def remove_attr(name) each { |el| el.delete(name) } self end
Remove the attributed named name
from all Node
objects in the NodeSet
# File lib/nokogiri/xml/node_set.rb, line 161 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.
# File lib/nokogiri/xml/node_set.rb, line 313 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.
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.
static VALUE to_array(VALUE self) { 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 = noko_xml_node_wrap_node_set_result(node_set->nodeTab[i], self); rb_ary_push(list, elt); } return list; }
Return this list as an Array
# File lib/nokogiri/xml/node_set.rb, line 276 def to_html(*args) if Nokogiri.jruby? options = args.first.is_a?(Hash) ? args.shift : {} unless 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
# File lib/nokogiri/xml/node_set.rb, line 270 def to_s map(&:to_s).join end
Convert this NodeSet
to a string.
# File lib/nokogiri/xml/node_set.rb, line 289 def to_xhtml(*args) map { |x| x.to_xhtml(*args) }.join end
Convert this NodeSet
to XHTML
static VALUE unlink_nodeset(VALUE self) { xmlNodeSetPtr node_set; int j, nodeNr ; Data_Get_Struct(self, xmlNodeSet, node_set); nodeNr = node_set->nodeNr ; for (j = 0 ; j < nodeNr ; j++) { if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) { VALUE node ; xmlNodePtr node_ptr; node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]); rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */ Data_Get_Struct(node, xmlNode, node_ptr); node_set->nodeTab[j] = node_ptr ; } } return self ; }
Unlink this NodeSet
and all Node
objects it contains from their current context.
# File lib/nokogiri/xml/node_set.rb, line 264 def wrap(html) map { |node| node.wrap(html) } end
Wrap this NodeSet
with html
# File lib/nokogiri/xml/node_set.rb, line 97 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
static VALUE rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other) { xmlNodeSetPtr c_node_set, c_other; xmlNodeSetPtr c_new_node_set; if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) { rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); } Data_Get_Struct(rb_node_set, xmlNodeSet, c_node_set); Data_Get_Struct(rb_other, xmlNodeSet, c_other); c_new_node_set = xmlXPathNodeSetMerge(NULL, c_node_set); c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other); return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_node_set, "@document")); }
Returns a new set built by merging the set and the elements of the given set.
© 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.
https://nokogiri.org/rdoc/Nokogiri/XML/NodeSet.html