 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Navigating a Document with XPath | ||
|---|---|---|
| Code | Expected | Actual | 
| xml = %{
<aquarium>
 <fish color="blue" size="small" />
 <fish color="orange" size="large">
   <fish color="green" size="small">
    <fish color="red" size="tiny" />
   </fish>
 </fish>
 <decoration type="castle" style="gaudy">
  <algae color="green" />
 </decoration>
</aquarium>}
require 'rexml/document'
doc = REXML::Document.new xml
REXML::XPath.first(doc, '//fish')              | <fish size='small' color='blue'/> | <fish size='small' color='blue'/> | 
| REXML::XPath.match(doc, '//[@color="green"]') | [<fish size='small' color='green'> ... </>, <algae color='green'/>] | [<fish size='small' color='green'> ... </>, <algae color='green'/>] | 
| def describe(fish)
  "#{fish.attribute('size')} #{fish.attribute('color')} fish"
end
REXML::XPath.each(doc, '//fish/fish') do |fish|
  puts "The #{describe(fish.parent)} has eaten the #{describe(fish)}."
end | The large orange fish has eaten the small green fish. The small green fish has eaten the tiny red fish. | The large orange fish has eaten the small green fish. The small green fish has eaten the tiny red fish. | 
| red_fish = doc.children[0].children[3].children[1].children[1] | <fish size='tiny' color='red'/> | <fish size='tiny' color='red'/> | 
| red_fish.xpath | "/aquarium/fish[2]/fish/fish" | "/aquarium/fish[2]/fish/fish" | 
| REXML::XPath.first(doc, red_fish.xpath) | <fish size='tiny' color='red'/> | <fish size='tiny' color='red'/> | 
| REXML::XPath.match(doc, '//[@color="green"]')[1] | <algae color='green'/> | <algae color='green'/> | 
| REXML::XPath.match(doc, '//fish[@size="small"]/@color') | [color='blue', color='green'] | [color='blue', color='green'] | 
| REXML::XPath.first(doc, "count(//fish[@size='large'][1]//*fish)") | 2 | 2 | 
| doc.elements.each('//fish') { |f| puts f.attribute('color') } | blue orange green red | blue orange green red | 
| doc.elements['//fish'] | <fish size='small' color='blue'/> | <fish size='small' color='blue'/> | 
| doc.elements[1] | <aquarium> ... </> | <aquarium> ... </> | 
| doc.children[0] | <aquarium> ... </> | <aquarium> ... </> |