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> ... </> |