module Nokogiri::XML::Searchable

Public Instance Methods

ancestor(selector = nil) click to toggle source

Like +Searchable#ancestors+, but returns only the first matching ancestor.

@example

xml = Nokogiri::XML(<<-XML)
  <body>
    <div id="a">
      <div id="b">
        <img src="cat.jpg">
      </div>
    </div>
  </body>
XML

xml.at("img").ancestor("div")  # == Node div#b
xml.at("img").ancestor("#a")   # == Node div#a
xml.at("img").ancestor("#z")   # == nil

@param selector [String] @return [Nokogiri::XML::Element, nil]

# File lib/ryoba/nokogiri/xml/searchable.rb, line 104
def ancestor(selector = nil)
  self.ancestors(selector).first
end
ancestor!(selector = nil) click to toggle source

Like +Searchable#ancestors!+, but returns only the first matching ancestor.

@example

xml = Nokogiri::XML(<<-XML)
  <body>
    <div id="a">
      <div id="b">
        <img src="cat.jpg">
      </div>
    </div>
  </body>
XML

xml.at("img").ancestor!("div")  # == Node div#b
xml.at("img").ancestor!("#a")   # == Node div#a
xml.at("img").ancestor!("#z")   # raise error

@param selector [String] @return [Nokogiri::XML::Element] @raise [Ryoba::Error]

if no ancestors match +selector+
# File lib/ryoba/nokogiri/xml/searchable.rb, line 130
def ancestor!(selector = nil)
  self.ancestors!(selector).first
end
ancestors!(selector = nil) click to toggle source

Like +Searchable#ancestors+, but raises an error if there are no matching ancestors.

@example

xml = Nokogiri::XML(<<-XML)
  <body>
    <div id="a">
      <div id="b">
        <img src="cat.jpg">
      </div>
    </div>
  </body>
XML

xml.at("img").ancestors!("div")  # == NodeSet [div#b, div#a]
xml.at("img").ancestors!("#a")   # == NodeSet [div#a]
xml.at("img").ancestors!("#z")   # raise error

@param selector [String] @return [Nokogiri::XML::NodeSet] @raise [Ryoba::Error]

if no ancestors match +selector+
# File lib/ryoba/nokogiri/xml/searchable.rb, line 76
def ancestors!(selector = nil)
  results = self.ancestors(selector)
  if results.empty?
    raise Ryoba::Error.new("No ancestors matching #{selector.inspect}")
  end
  results
end
at!(*queries) click to toggle source

Like +Searchable#at+, but raises an error if there are no results.

@example

xml = Nokogiri::XML(<<-XML)
  <body>
    <div id="a" />
    <div id="b" />
  </body>
XML

xml.at!("div")  # == Node div#a
xml.at!("img")  # raise error

@param queries [Array<String>] @return [Nokogiri::XML::Element] @raise [Ryoba::Error]

if all queries yield no results
# File lib/ryoba/nokogiri/xml/searchable.rb, line 46
def at!(*queries)
  result = self.at(*queries)
  if result.nil?
    raise Ryoba::Error.new("No elements matching #{queries.map(&:inspect).join(" OR ")}")
  end
  result
end
search!(*queries) click to toggle source

Like +Searchable#search+, but raises an error if there are no results.

@example

xml = Nokogiri::XML(<<-XML)
  <body>
    <div id="a" />
    <div id="b" />
  </body>
XML

xml.search!("div")  # == NodeSet [div#a, div#b]
xml.search!("img")  # raise error

@param queries [Array<String>] @return [Nokogiri::XML::NodeSet] @raise [Ryoba::Error]

if all queries yield no results
# File lib/ryoba/nokogiri/xml/searchable.rb, line 21
def search!(*queries)
  results = self.search(*queries)
  if results.empty?
    raise Ryoba::Error.new("No elements matching #{queries.map(&:inspect).join(" OR ")}")
  end
  results
end