Module: Nokogiri::XML::Searchable

Defined in:
lib/ryoba/nokogiri/xml/searchable.rb

Instance Method Summary collapse

Instance Method Details

#ancestor(selector = nil) ⇒ Nokogiri::XML::Element?

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

Examples:

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

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

Parameters:

  • selector (String) (defaults to: nil)

Returns:

  • (Nokogiri::XML::Element, nil)


103
104
105
# File 'lib/ryoba/nokogiri/xml/searchable.rb', line 103

def ancestor(selector = nil)
  self.ancestors(selector).first
end

#ancestor!(selector = nil) ⇒ Nokogiri::XML::Element

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

Examples:

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

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

Parameters:

  • selector (String) (defaults to: nil)

Returns:

  • (Nokogiri::XML::Element)

Raises:



128
129
130
# File 'lib/ryoba/nokogiri/xml/searchable.rb', line 128

def ancestor!(selector = nil)
  self.ancestors!(selector).first
end

#ancestors!(selector = nil) ⇒ Nokogiri::XML::NodeSet

Like #ancestors, but raises an exception if there are no matching ancestors.

Examples:

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

xml.at("img").ancestors!         # == NodeSet [div#b, div#a, body]
xml.at("img").ancestors!("div")  # == NodeSet [div#b, div#a]
xml.at("img").ancestors!("#a")   # == NodeSet [div#a]
xml.at("img").ancestors!("#z")   # raises exception

Parameters:

  • selector (String) (defaults to: nil)

Returns:

  • (Nokogiri::XML::NodeSet)

Raises:



76
77
78
79
80
81
82
# 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) ⇒ Nokogiri::XML::Element

Like #at, but raises an exception if there are no results.

Examples:

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

xml.at!("div")  # == Node div#a
xml.at!("img")  # raises exception

Parameters:

  • queries (Array<String>)

Returns:

  • (Nokogiri::XML::Element)

Raises:



45
46
47
48
49
50
51
# File 'lib/ryoba/nokogiri/xml/searchable.rb', line 45

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) ⇒ Nokogiri::XML::NodeSet

Like #search, but raises an exception if there are no results.

Examples:

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

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

Parameters:

  • queries (Array<String>)

Returns:

  • (Nokogiri::XML::NodeSet)

Raises:



20
21
22
23
24
25
26
# File 'lib/ryoba/nokogiri/xml/searchable.rb', line 20

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