Class Nokogiri::XML::NodeSet inherits from Object
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::Node#css or Nokogiri::XML::Node#xpath
Attributes
Public Class Methods
- new(document, list = []) Show Source
Create a NodeSet with document defaulting to list
-
# File lib/nokogiri/xml/node_set.rb, line 14 def initialize document, list = [] @document = document list.each { |x| self << x } yield self if block_given? end
Public Instance Methods
- %(path, ns = document.root ? document.root.namespaces : {})
Alias for at
- &(p1) Show Source
Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
-
static VALUE intersection(VALUE self, VALUE rb_other) { xmlNodeSetPtr node_set; xmlNodeSetPtr other; 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); return Nokogiri_wrap_xml_node_set(xmlXPathIntersection(node_set, other)); }
- -(p1) Show Source
Difference - returns a new NodeSet that is a copy of this NodeSet, removing each item that also appears in node_set
-
static VALUE minus(VALUE self, VALUE rb_other) { xmlNodeSetPtr node_set; xmlNodeSetPtr 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) { xmlXPathNodeSetDel(new, other->nodeTab[j]); } return Nokogiri_wrap_xml_node_set(new); }
- /(*paths)
Alias for search
- <<(p1)
Alias for push
- ==(other) Show Source
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
-
# File lib/nokogiri/xml/node_set.rb, line 288 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
- [](...) Show Source
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 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 ; } if (len > node_set->nodeNr) len = 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, node_set->nodeNr, 0)) { case Qfalse: break; case Qnil: return Qnil; default: return subseq(self, beg, len); } return index_at(self, NUM2LONG(arg)); }
- add_class(name) Show Source
Append the class attribute name to all Node objects in the NodeSet.
-
# File lib/nokogiri/xml/node_set.rb, line 157 def add_class name each do |el| classes = el['class'].to_s.split(/\s+/) el['class'] = classes.push(name).uniq.join " " end self end
- after(datum) Show Source
-
# File lib/nokogiri/xml/node_set.rb, line 58 def after datum last.after datum end
- at(path, ns = document.root ? document.root.namespaces : {}) Show Source
If path is a string, search this document for path returning the first Node. Otherwise, index in to the array with path.
-
# File lib/nokogiri/xml/node_set.rb, line 143 def at path, ns = document.root ? document.root.namespaces : {} return self[path] if path.is_a?(Numeric) search(path, ns).first end
- attr(key, value = nil, &blk) Show Source
Set the attribute key to value or the return value of blk on all Node objects in the NodeSet.
-
# File lib/nokogiri/xml/node_set.rb, line 188 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
- attribute(key, value = nil, &blk)
Alias for attr
- before(datum) Show Source
-
# File lib/nokogiri/xml/node_set.rb, line 52 def before datum first.before datum end
- children() Show Source
Returns a new NodeSet containing all the children of all the nodes in the NodeSet
-
# File lib/nokogiri/xml/node_set.rb, line 300 def children inject(NodeSet.new(document)) { |set, node| set += node.children } end
- css(*paths) Show Source
Search this NodeSet for css paths
For more information see Nokogiri::XML::Node#css
-
# File lib/nokogiri/xml/node_set.rb, line 95 def css *paths handler = ![ Hash, String, Symbol ].include?(paths.last.class) ? paths.pop : nil ns = paths.last.is_a?(Hash) ? paths.pop : nil sub_set = NodeSet.new(document) each do |node| doc = node.document search_ns = ns || doc.root ? doc.root.namespaces : {} xpaths = paths.map { |rule| [ CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns), CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns) ].join(' | ') } sub_set += node.xpath(*(xpaths + [search_ns, handler].compact)) end document.decorate(sub_set) sub_set end
- delete(p1) Show Source
Delete node from the Nodeset, if it is a member. Returns the deleted node if found, otherwise returns nil.
-
static VALUE delete(VALUE self, VALUE rb_node) { xmlNodeSetPtr node_set ; xmlNodePtr node ; if(!rb_obj_is_kind_of(rb_node, cNokogiriXmlNode)) rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node"); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); if (xmlXPathNodeSetContains(node_set, node)) { xmlXPathNodeSetDel(node_set, node); return rb_node ; } return Qnil ; }
- dup() Show Source
Duplicate this node set
-
static VALUE duplicate(VALUE self) { xmlNodeSetPtr node_set; Data_Get_Struct(self, xmlNodeSet, node_set); xmlNodeSetPtr dupl = xmlXPathNodeSetMerge(NULL, node_set); return Nokogiri_wrap_xml_node_set(dupl); }
- each(&block) Show Source
Iterate over each node, yielding to block
-
# File lib/nokogiri/xml/node_set.rb, line 211 def each(&block) 0.upto(length - 1) do |x| yield self[x] end end
- empty?() Show Source
Is this NodeSet empty?
-
# File lib/nokogiri/xml/node_set.rb, line 39 def empty? length == 0 end
- filter(expr) Show Source
Filter this list for nodes that match expr
-
# File lib/nokogiri/xml/node_set.rb, line 151 def filter expr find_all { |node| node.matches?(expr) } end
- first(n = nil) Show Source
Get the first element of the NodeSet.
-
# File lib/nokogiri/xml/node_set.rb, line 22 def first n = nil return self[0] unless n list = [] 0.upto(n - 1) do |i| list << self[i] end list end
- include?(p1) Show Source
Returns true if any member of node set equals node.
-
static VALUE include_eh(VALUE self, VALUE rb_node) { xmlNodeSetPtr node_set; xmlNodePtr node; if(!rb_obj_is_kind_of(rb_node, cNokogiriXmlNode)) rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node"); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse); }
- index(node) Show Source
Returns the index of the first node in self that is == to node. Returns nil if no match is found.
-
# File lib/nokogiri/xml/node_set.rb, line 45 def index(node) each_with_index { |member, j| return j if member == node } nil end
- inner_html(*args) Show Source
Get the inner html of all contained Node objects
-
# File lib/nokogiri/xml/node_set.rb, line 226 def inner_html *args collect{|j| j.inner_html(*args) }.join('') end
- inner_text() Show Source
Get the inner text of all contained Node objects
-
# File lib/nokogiri/xml/node_set.rb, line 219 def inner_text collect{|j| j.inner_text}.join('') end
- inspect() Show Source
Return a nicely formated string representation
-
# File lib/nokogiri/xml/node_set.rb, line 317 def inspect "[#{map { |c| c.inspect }.join ', '}]" end
- last() Show Source
Get the last element of the NodeSet.
-
# File lib/nokogiri/xml/node_set.rb, line 33 def last self[length - 1] end
- length() Show Source
Get the length of the node set
-
static VALUE length(VALUE self) { xmlNodeSetPtr node_set; Data_Get_Struct(self, xmlNodeSet, node_set); if(node_set) return INT2NUM(node_set->nodeNr); return INT2NUM(0); }
- pop() Show Source
Removes the last element from set and returns it, or nil if the set is empty
-
# File lib/nokogiri/xml/node_set.rb, line 271 def pop return nil if length == 0 delete last end
- push(p1) Show Source
Append node to the NodeSet.
-
static VALUE push(VALUE self, VALUE rb_node) { xmlNodeSetPtr node_set; xmlNodePtr node; if(!rb_obj_is_kind_of(rb_node, cNokogiriXmlNode)) rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node"); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); xmlXPathNodeSetAdd(node_set, node); return self; }
- remove()
Alias for unlink
- remove_attr(name) Show Source
Remove the attributed named name from all Node objects in the NodeSet
-
# File lib/nokogiri/xml/node_set.rb, line 204 def remove_attr name each { |el| el.delete name } self end
- remove_class(name = nil) Show Source
Remove the class attribute name from all Node objects in the NodeSet. If name is nil, remove the class attribute from all Nodes in the NodeSet.
-
# File lib/nokogiri/xml/node_set.rb, line 169 def remove_class name = nil each do |el| if name classes = el['class'].to_s.split(/\s+/) if classes.empty? el.delete 'class' else el['class'] = (classes - [name]).uniq.join " " end else el.delete "class" end end self end
- reverse() Show Source
Returns a new NodeSet containing all the nodes in the NodeSet in reverse order
-
# File lib/nokogiri/xml/node_set.rb, line 307 def reverse node_set = NodeSet.new(document) (length - 1).downto(0) do |x| node_set.push self[x] end node_set end
- search(*paths) Show Source
Search this document for paths
For more information see Nokogiri::XML::Node#css and Nokogiri::XML::Node#xpath
-
# File lib/nokogiri/xml/node_set.rb, line 70 def search *paths handler = ![ Hash, String, Symbol ].include?(paths.last.class) ? paths.pop : nil ns = paths.last.is_a?(Hash) ? paths.pop : nil sub_set = NodeSet.new(document) paths.each do |path| sub_set += send( path =~ /^(\.\/|\/)/ ? :xpath : :css, *(paths + [ns, handler]).compact ) end document.decorate(sub_set) sub_set end
- set(key, value = nil, &blk)
Alias for attr
- shift() Show Source
Returns the first element of the NodeSet and removes it. Returns nil if the set is empty.
-
# File lib/nokogiri/xml/node_set.rb, line 279 def shift return nil if length == 0 delete first end
- size()
Alias for length
- slice(...) Show Source
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 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 ; } if (len > node_set->nodeNr) len = 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, node_set->nodeNr, 0)) { case Qfalse: break; case Qnil: return Qnil; default: return subseq(self, beg, len); } return index_at(self, NUM2LONG(arg)); }
- text()
Alias for inner_text
- to_a() Show Source
Return this list as an Array
-
static VALUE to_array(VALUE self, VALUE rb_node) { xmlNodeSetPtr set; Data_Get_Struct(self, xmlNodeSet, set); VALUE *elts = calloc((size_t)set->nodeNr, sizeof(VALUE *)); int i; for(i = 0; i < set->nodeNr; i++) { if (XML_NAMESPACE_DECL == set->nodeTab[i]->type) { elts[i] = Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(set->nodeTab[i])); } else { xmlNodePtr node = set->nodeTab[i]; if(node->_private) { if(node->type == XML_DOCUMENT_NODE || node->type == XML_HTML_DOCUMENT_NODE) elts[i] = DOC_RUBY_OBJECT(node->doc); else elts[i] = (VALUE)node->_private; } else { elts[i] = Nokogiri_wrap_xml_node(Qnil, node); } } } VALUE list = rb_ary_new4((long)set->nodeNr, elts); //free(elts); return list; }
- to_ary()
Alias for to_a
- to_html(*args) Show Source
-
# File lib/nokogiri/xml/node_set.rb, line 249 def to_html *args map { |x| x.to_html(*args) }.join end
- to_s() Show Source
Convert this NodeSet to a string.
-
# File lib/nokogiri/xml/node_set.rb, line 243 def to_s map { |x| x.to_s }.join end
- to_xhtml(*args) Show Source
Convert this NodeSet to XHTML
-
# File lib/nokogiri/xml/node_set.rb, line 255 def to_xhtml *args map { |x| x.to_xhtml(*args) }.join end
- to_xml(*args) Show Source
-
# File lib/nokogiri/xml/node_set.rb, line 261 def to_xml *args map { |x| x.to_xml(*args) }.join end
- unlink() Show Source
Unlink this NodeSet and all Node objects it contains from their current context.
-
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 (XML_NAMESPACE_DECL != node_set->nodeTab[j]->type) { VALUE node ; xmlNodePtr node_ptr; node = Nokogiri_wrap_xml_node(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 ; }
- wrap(html, &blk) Show Source
Wrap this NodeSet with html or the results of the builder in blk
-
# File lib/nokogiri/xml/node_set.rb, line 232 def wrap(html, &blk) each do |j| new_parent = Nokogiri.make(html, &blk) j.add_next_sibling(new_parent) new_parent.add_child(j) end self end
- xpath(*paths) Show Source
Search this NodeSet for XPath paths
For more information see Nokogiri::XML::Node#xpath
-
# File lib/nokogiri/xml/node_set.rb, line 125 def xpath *paths handler = ![ Hash, String, Symbol ].include?(paths.last.class) ? paths.pop : nil ns = paths.last.is_a?(Hash) ? paths.pop : nil sub_set = NodeSet.new(document) each do |node| sub_set += node.xpath(*(paths + [ns, handler].compact)) end document.decorate(sub_set) sub_set end
- |(p1) Show Source
Returns a new set built by merging the set and the elements of the given set.
-
static VALUE set_union(VALUE self, VALUE rb_other) { xmlNodeSetPtr node_set; xmlNodeSetPtr 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); VALUE new_set = Nokogiri_wrap_xml_node_set(new); rb_iv_set(new_set, "@document", rb_iv_get(self, "@document")); return new_set; }