Class: Nokogiri::XML::NodeSet
- Inherits:
-
Object
- Object
- Nokogiri::XML::NodeSet
- Includes:
- Enumerable
- Defined in:
- lib/nokogiri/xml/node_set.rb,
lib/nokogiri/ffi/xml/node_set.rb,
ext/nokogiri/xml_node_set.c
Overview
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
Instance Attribute Summary collapse
-
#cstruct ⇒ Object
:nodoc:.
-
#document ⇒ Object
The Document this NodeSet is associated with.
Class Method Summary collapse
Instance Method Summary collapse
-
#&(node_set) ⇒ Object
Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
- #+ ⇒ Object
-
#-(node_set) ⇒ Object
Difference - returns a new NodeSet that is a copy of this NodeSet, removing each item that also appears in
node_set
. - #<< ⇒ Object
-
#==(other) ⇒ Object
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.
-
#[](*args) ⇒ Object
(also: #slice)
- start, length
-
-> NodeSet or nil [range] -> NodeSet or nil slice(index) -> Node or nil slice(start, length) -> NodeSet or nil slice(range) -> NodeSet or nil.
-
#add_class(name) ⇒ Object
Append the class attribute
name
to all Node objects in the NodeSet. -
#after(datum) ⇒ Object
Insert
datum
after the last Node in this NodeSet. -
#at(path, ns = document.root ? document.root.namespaces : {}) ⇒ Object
(also: #%)
If path is a string, search this document for
path
returning the first Node. -
#attr(key, value = nil, &blk) ⇒ Object
(also: #set, #attribute)
Set the attribute
key
tovalue
or the return value ofblk
on all Node objects in the NodeSet. -
#before(datum) ⇒ Object
Insert
datum
before the first Node in this NodeSet. -
#children ⇒ Object
Returns a new NodeSet containing all the children of all the nodes in the NodeSet.
-
#css(*paths) ⇒ Object
Search this NodeSet for css
paths
. -
#delete(node) ⇒ Object
Delete
node
from the Nodeset, if it is a member. -
#dup ⇒ Object
Duplicate this node set.
-
#each(&block) ⇒ Object
Iterate over each node, yielding to
block
. -
#empty? ⇒ Boolean
Is this NodeSet empty?.
-
#filter(expr) ⇒ Object
Filter this list for nodes that match
expr
. -
#first(n = nil) ⇒ Object
Get the first element of the NodeSet.
-
#include?(node) ⇒ Boolean
Returns true if any member of node set equals
node
. -
#index(node) ⇒ Object
Returns the index of the first node in self that is == to
node
. -
#initialize(document, list = []) {|_self| ... } ⇒ NodeSet
constructor
Create a NodeSet with
document
defaulting tolist
. -
#inner_html(*args) ⇒ Object
Get the inner html of all contained Node objects.
-
#inner_text ⇒ Object
(also: #text)
Get the inner text of all contained Node objects.
-
#inspect ⇒ Object
Return a nicely formated string representation.
-
#last ⇒ Object
Get the last element of the NodeSet.
-
#length ⇒ Object
Get the length of the node set.
-
#pop ⇒ Object
Removes the last element from set and returns it, or
nil
if the set is empty. -
#push(node) ⇒ Object
Append
node
to the NodeSet. - #remove ⇒ Object
-
#remove_attr(name) ⇒ Object
Remove the attributed named
name
from all Node objects in the NodeSet. -
#remove_class(name = nil) ⇒ Object
Remove the class attribute
name
from all Node objects in the NodeSet. -
#reverse ⇒ Object
Returns a new NodeSet containing all the nodes in the NodeSet in reverse order.
-
#search(*paths) ⇒ Object
(also: #/)
Search this document for
paths
. -
#shift ⇒ Object
Returns the first element of the NodeSet and removes it.
- #size ⇒ Object
-
#to_a ⇒ Object
Return this list as an Array.
- #to_ary ⇒ Object
-
#to_html(*args) ⇒ Object
Convert this NodeSet to HTML.
-
#to_s ⇒ Object
Convert this NodeSet to a string.
-
#to_xhtml(*args) ⇒ Object
Convert this NodeSet to XHTML.
-
#to_xml(*args) ⇒ Object
Convert this NodeSet to XML.
-
#unlink ⇒ Object
Unlink this NodeSet and all Node objects it contains from their current context.
-
#wrap(html, &blk) ⇒ Object
Wrap this NodeSet with
html
or the results of the builder inblk
. -
#xpath(*paths) ⇒ Object
Search this NodeSet for XPath
paths
. -
#|(node_set) ⇒ Object
Returns a new set built by merging the set and the elements of the given set.
Constructor Details
#initialize(document, list = []) {|_self| ... } ⇒ NodeSet
Create a NodeSet with document
defaulting to list
14 15 16 17 18 |
# 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 |
Instance Attribute Details
#cstruct ⇒ Object
:nodoc:
5 6 7 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 5 def cstruct @cstruct end |
#document ⇒ Object
The Document this NodeSet is associated with
11 12 13 |
# File 'lib/nokogiri/xml/node_set.rb', line 11 def document @document end |
Class Method Details
.new(document, list = []) {|set| ... } ⇒ Object
:nodoc:
105 106 107 108 109 110 111 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 105 def self.new document, list = [] # :nodoc: set = NodeSet.wrap(LibXML.xmlXPathNodeSetCreate(nil)) set.document = document list.each { |x| set << x } yield set if block_given? set end |
Instance Method Details
#&(node_set) ⇒ Object
Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
69 70 71 72 73 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 69 def &(node_set) # :nodoc: raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet) new_set_ptr = LibXML.xmlXPathIntersection(cstruct, node_set.cstruct) NodeSet.wrap(new_set_ptr) end |
#+ ⇒ Object
321 |
# File 'lib/nokogiri/xml/node_set.rb', line 321 alias :+ :| |
#-(node_set) ⇒ Object
Difference - returns a new NodeSet that is a copy of this NodeSet, removing
each item that also appears in +node_set+
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 32 def -(node_set) # :nodoc: raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet) new_set_ptr = LibXML.xmlXPathNodeSetMerge(nil, self.cstruct) other_nodetab = node_set.cstruct.nodeTab node_set.cstruct[:nodeNr].times do |j| LibXML.xmlXPathNodeSetDel(new_set_ptr, other_nodetab[j]) end NodeSet.wrap(new_set_ptr) end |
#<< ⇒ Object
62 |
# File 'lib/nokogiri/xml/node_set.rb', line 62 alias :<< :push |
#==(other) ⇒ Object
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
288 289 290 291 292 293 294 295 |
# 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 |
#[](*args) ⇒ Object Also known as: slice
- start, length
-
-> NodeSet or nil
- range
-
-> NodeSet or nil
slice(index) -> Node or nil
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.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 52 def [](*args) # :nodoc: raise(ArgumentError, "got #{args.length} arguments, expected 1 (or 2)") if args.length > 2 if args.length == 2 beg = args[0] len = args[1] beg += cstruct[:nodeNr] if beg < 0 return subseq(beg, len) end arg = args[0] return subseq(arg.first, arg.last-arg.first+1) if arg.is_a?(Range) index_at(arg) end |
#add_class(name) ⇒ Object
Append the class attribute name
to all Node objects in the NodeSet.
157 158 159 160 161 162 163 |
# 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) ⇒ Object
Insert datum
after the last Node in this NodeSet
58 59 60 |
# File 'lib/nokogiri/xml/node_set.rb', line 58 def after datum last.after datum end |
#at(path, ns = document.root ? document.root.namespaces : {}) ⇒ Object Also known as: %
If path is a string, search this document for path
returning the first Node. Otherwise, index in to the array with path
.
143 144 145 146 |
# 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) ⇒ Object Also known as: set, attribute
Set the attribute key
to value
or the return value of blk
on all Node objects in the NodeSet.
188 189 190 191 192 193 194 195 196 197 198 |
# 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 |
#before(datum) ⇒ Object
Insert datum
before the first Node in this NodeSet
52 53 54 |
# File 'lib/nokogiri/xml/node_set.rb', line 52 def before datum first.before datum end |
#children ⇒ Object
Returns a new NodeSet containing all the children of all the nodes in the NodeSet
300 301 302 |
# File 'lib/nokogiri/xml/node_set.rb', line 300 def children inject(NodeSet.new(document)) { |set, node| set += node.children } end |
#css(*paths) ⇒ Object
Search this NodeSet for css paths
For more information see Nokogiri::XML::Node#css
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# 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(node) ⇒ Object
Delete node
from the Nodeset, if it is a member. Returns the deleted node if found, otherwise returns nil.
43 44 45 46 47 48 49 50 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 43 def delete(node) # :nodoc: raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) if LibXML.xmlXPathNodeSetContains(cstruct, node.cstruct) != 0 LibXML.xmlXPathNodeSetDel(cstruct, node.cstruct) return node end return nil end |
#dup ⇒ Object
Duplicate this node set
7 8 9 10 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 7 def dup # :nodoc: dup = LibXML.xmlXPathNodeSetMerge(nil, self.cstruct) NodeSet.wrap(dup) end |
#each(&block) ⇒ Object
Iterate over each node, yielding to block
211 212 213 214 215 |
# File 'lib/nokogiri/xml/node_set.rb', line 211 def each(&block) 0.upto(length - 1) do |x| yield self[x] end end |
#empty? ⇒ Boolean
Is this NodeSet empty?
39 40 41 |
# File 'lib/nokogiri/xml/node_set.rb', line 39 def empty? length == 0 end |
#filter(expr) ⇒ Object
Filter this list for nodes that match expr
151 152 153 |
# File 'lib/nokogiri/xml/node_set.rb', line 151 def filter expr find_all { |node| node.matches?(expr) } end |
#first(n = nil) ⇒ Object
Get the first element of the NodeSet.
22 23 24 25 26 27 28 29 |
# 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?(node) ⇒ Boolean
Returns true if any member of node set equals node
.
75 76 77 78 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 75 def include?(node) # :nodoc: raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) (LibXML.xmlXPathNodeSetContains(cstruct, node.cstruct) != 0) ? true : false end |
#index(node) ⇒ Object
Returns the index of the first node in self that is == to node
. Returns nil if no match is found.
45 46 47 48 |
# 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) ⇒ Object
Get the inner html of all contained Node objects
226 227 228 |
# File 'lib/nokogiri/xml/node_set.rb', line 226 def inner_html *args collect{|j| j.inner_html(*args) }.join('') end |
#inner_text ⇒ Object Also known as: text
Get the inner text of all contained Node objects
219 220 221 |
# File 'lib/nokogiri/xml/node_set.rb', line 219 def inner_text collect{|j| j.inner_text}.join('') end |
#inspect ⇒ Object
Return a nicely formated string representation
317 318 319 |
# File 'lib/nokogiri/xml/node_set.rb', line 317 def inspect "[#{map { |c| c.inspect }.join ', '}]" end |
#last ⇒ Object
Get the last element of the NodeSet.
33 34 35 |
# File 'lib/nokogiri/xml/node_set.rb', line 33 def last self[length - 1] end |
#length ⇒ Object
Get the length of the node set
12 13 14 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 12 def length # :nodoc: cstruct.pointer.null? ? 0 : cstruct[:nodeNr] end |
#pop ⇒ Object
Removes the last element from set and returns it, or nil
if the set is empty
271 272 273 274 |
# File 'lib/nokogiri/xml/node_set.rb', line 271 def pop return nil if length == 0 delete last end |
#push(node) ⇒ Object
Append node
to the NodeSet.
16 17 18 19 20 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 16 def push(node) # :nodoc: raise(ArgumentError, "node must be a Nokogiri::XML::Node") unless node.is_a?(XML::Node) LibXML.xmlXPathNodeSetAdd(cstruct, node.cstruct) self end |
#remove ⇒ Object
63 |
# File 'lib/nokogiri/xml/node_set.rb', line 63 alias :remove :unlink |
#remove_attr(name) ⇒ Object
Remove the attributed named name
from all Node objects in the NodeSet
204 205 206 207 |
# File 'lib/nokogiri/xml/node_set.rb', line 204 def remove_attr name each { |el| el.delete name } self end |
#remove_class(name = nil) ⇒ Object
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.
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# 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 ⇒ Object
Returns a new NodeSet containing all the nodes in the NodeSet in reverse order
307 308 309 310 311 312 313 |
# 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) ⇒ Object Also known as: /
Search this document for paths
For more information see Nokogiri::XML::Node#css and Nokogiri::XML::Node#xpath
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# 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 |
#shift ⇒ Object
Returns the first element of the NodeSet and removes it. Returns nil
if the set is empty.
279 280 281 282 |
# File 'lib/nokogiri/xml/node_set.rb', line 279 def shift return nil if length == 0 delete first end |
#size ⇒ Object
265 |
# File 'lib/nokogiri/xml/node_set.rb', line 265 alias :size :length |
#to_a ⇒ Object
Return this list as an Array
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 80 def to_a # :nodoc: cstruct.nodeTab.collect do |node| node_cstruct = LibXML::XmlNode.new(node) if node_cstruct[:type] == XML::Node::NAMESPACE_DECL Namespace.wrap(document.cstruct, node) else Node.wrap(node_cstruct) end end end |
#to_ary ⇒ Object
266 |
# File 'lib/nokogiri/xml/node_set.rb', line 266 alias :to_ary :to_a |
#to_html(*args) ⇒ Object
Convert this NodeSet to HTML
249 250 251 |
# File 'lib/nokogiri/xml/node_set.rb', line 249 def to_html *args map { |x| x.to_html(*args) }.join end |
#to_s ⇒ Object
Convert this NodeSet to a string.
243 244 245 |
# File 'lib/nokogiri/xml/node_set.rb', line 243 def to_s map { |x| x.to_s }.join end |
#to_xhtml(*args) ⇒ Object
Convert this NodeSet to XHTML
255 256 257 |
# File 'lib/nokogiri/xml/node_set.rb', line 255 def to_xhtml *args map { |x| x.to_xhtml(*args) }.join end |
#to_xml(*args) ⇒ Object
Convert this NodeSet to XML
261 262 263 |
# File 'lib/nokogiri/xml/node_set.rb', line 261 def to_xml *args map { |x| x.to_xml(*args) }.join end |
#unlink ⇒ Object
Unlink this NodeSet and all Node objects it contains from their current context.
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 91 def unlink # :nodoc: nodetab = cstruct.nodeTab cstruct[:nodeNr].times do |j| node_cstruct = LibXML::XmlNode.new(nodetab[j]) if node_cstruct[:type] != XML::Node::NAMESPACE_DECL node = Node.wrap(node_cstruct) node.unlink nodetab[j] = node.cstruct.pointer end end cstruct.nodeTab = nodetab self end |
#wrap(html, &blk) ⇒ Object
Wrap this NodeSet with html
or the results of the builder in blk
232 233 234 235 236 237 238 239 |
# 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) ⇒ Object
Search this NodeSet for XPath paths
For more information see Nokogiri::XML::Node#xpath
125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# 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 |
#|(node_set) ⇒ Object
Returns a new set built by merging the set and the elements of the given set.
22 23 24 25 26 27 28 29 30 |
# File 'lib/nokogiri/ffi/xml/node_set.rb', line 22 def |(node_set) # :nodoc: raise(ArgumentError, "node_set must be a Nokogiri::XML::NodeSet") unless node_set.is_a?(XML::NodeSet) new_set_ptr = LibXML::xmlXPathNodeSetMerge(nil, self.cstruct) new_set_ptr = LibXML::xmlXPathNodeSetMerge(new_set_ptr, node_set.cstruct) new_set = NodeSet.wrap(new_set_ptr) new_set.document = document new_set end |