Adds XML finders to Nokogiri that raise if nothing is found.
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
.gitignore
.rspec
CHANGELOG.md
Gemfile
LICENSE.txt
README.md
Rakefile
nokogiri_bang_finders.gemspec

README.md

nokogiri_bang_finders

This gem says "Nokogiri, if you can't find the XML I want, yell about it."

For example:

doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
doc.at('alien').content # => "Alf"

# without nokogiri_bang_finders
doc.at('robot').content # NoMethodError: undefined method `content' for nil:nilclass

# with nokogiri_bang_finders
doc.at!('robot').content # Nokogiri::XML::NotFound: '["robot"] in {snippet of the XML}'

Specifically, this gem adds the following methods to to Nokogiri::XML::Node and Nokogiri::XML::NodeSet:

  • at!
  • at_xpath!
  • at_css!

Each method just calls its non-bang namesake and, if the result is nil, raises Nokogiri::XML::NotFound.

This gem is so tiny, you could just copy and paste its code. But if it's convenient, use it. 😄

Context

When an exception is raised, its message includes some context from the document, to show "I was looking for your selector in a document that looks like this". By default, up to 200 characters of context are given.

You can specify an integer number of characters of context, like Nokogiri::XML::BangFinders.context_length = 500.

Or you can specify :all to get the whole document in the exception message (though this probably isn't a good idea for production code): Nokogiri::XML::BangFinders.context_length = :all

Installation

$ gem install nokogiri_bang_finders

... or via Bundler.

Requiring

Be sure to require 'nokogiri_bang_finders' after you require 'nokogiri'. It expects Nokogiri::XML::Node and Nokogiri::XML::NodeSet to be defined so that it can add methods to them.

Usage

Use these methods just like you would use the normal Nokogiri versions, but expect an exception if the XML doesn't contain what you're looking for.