Nokogiri::XML::NodeSet

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

Create a NodeSet with document defaulting to list

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

Public Instance Methods

%(*args)
Alias for: at
&(node_set) 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, 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"));
}
+(p1)
Alias for: |
-(node_set) 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, 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"));
}
<<(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 280
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
>(selector) Show source

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

# File lib/nokogiri/xml/node_set.rb, line 97
def > selector
  ns = document.root.namespaces
  xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
end
[index] → Node or nil Show source
[start, length] → NodeSet or nil
[range] → NodeSet or nil

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 ;
    }
    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));
}
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 131
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

Insert datum after the last Node in this NodeSet

# File lib/nokogiri/xml/node_set.rb, line 58
def after datum
  last.after datum
end
search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] Show source

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
# File lib/nokogiri/xml/node_set.rb, line 114
def at *args
  if args.length == 1 && args.first.is_a?(Numeric)
    return self[args.first]
  end

  super(*args)
end
Also aliased as: %
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 162
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
Also aliased as: set, attribute
attribute(key, value = nil, &blk)
Alias for: attr
before(datum) Show source

Insert datum before the first Node in this NodeSet

# 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 292
def children
  inject(NodeSet.new(document)) { |set, node| set += node.children }
end
css *rules, [namespace-bindings, custom-pseudo-class] Show source

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

# File lib/nokogiri/xml/node_set.rb, line 72
def css *args
  rules, handler, ns, _ = extract_params(args)

  inject(NodeSet.new(document)) do |set, node|
    set += css_internal node, rules, handler, ns
  end
end
delete(node) 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;

  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 ;
}

Duplicate this node set

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"));
}
each() { |self| ... } Show source

Iterate over each node, yielding to block

# File lib/nokogiri/xml/node_set.rb, line 185
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 125
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 24
def first n = nil
  return self[0] unless n
  list = []
  n.times { |i| list << self[i] }
  list
end
include?(node) 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;

  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);
}
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 211
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

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 204
def inner_text
  collect(&:inner_text).join('')
end
Also aliased as: text
inspect() Show source

Return a nicely formated string representation

# File lib/nokogiri/xml/node_set.rb, line 309
def inspect
  "[#{map(&: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[-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);

  return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0);
}
Also aliased as: size
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 263
def pop
  return nil if length == 0
  delete last
end
push(node) Show source

Append node to the NodeSet.

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;
}
Also aliased as: <<
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 178
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 143
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 299
def reverse
  node_set = NodeSet.new(document)
  (length - 1).downto(0) do |x|
    node_set.push self[x]
  end
  node_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 271
def shift
  return nil if length == 0
  delete first
end
size()
Alias for: length
slice(index) → Node or nil Show source
slice(start, length) → NodeSet or nil
slice(range) → NodeSet or nil

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 ;
    }
    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));
}
text()
Alias for: inner_text

Return this list as an Array

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;
}
Also aliased as: to_ary
to_ary()
Alias for: to_a
to_html(*args) Show source

Convert this NodeSet to HTML

# File lib/nokogiri/xml/node_set.rb, line 234
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
to_s() Show source

Convert this NodeSet to a string.

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

Convert this NodeSet to XHTML

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

Convert this NodeSet to XML

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

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

Also aliased as: remove
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 217
def wrap(html, &blk)
  each do |j|
    new_parent = document.parse(html).first
    j.add_next_sibling(new_parent)
    new_parent.add_child(j)
  end
  self
end
xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class] Show source

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

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

# File lib/nokogiri/xml/node_set.rb, line 87
def xpath *args
  paths, handler, ns, binds = extract_params(args)

  inject(NodeSet.new(document)) do |set, node|
    set += node.xpath(*(paths + [ns, handler, binds].compact))
  end
end
|(node_set) 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, 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"));
}
Also aliased as: +

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

在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号

意见反馈
返回顶部