If you just want to walk the tree from any entry point, through all
the sub-levels, you can use the standard each_recurse method.
#Recurse end to end, printing the tags
@doc.elements.each("definitions/src") do |element|
print "<", element.name.to_s, ">"
element.each_recursive do |childElement|
print "<", childElement.name.to_s, ">"
end
end
If you just want the next level of children, but no deeper, I'm not
sure what you call. I did this when I played with REXML, and the
obvious each_child doesn't give you an REXML::Element. It gives a
REXML::Text element at the first iteration, then the next
REXML::Element, then another REXML::Text object, etc. Not quite what
you want. But adding this to your code will work.
module REXML
# Visit all children of this node, but don't recurse to their children
def each_child_element(&block)
self.elements.each {|node|
block.call(node)
}
end
end
It probably exists in some form in the REXML module, but I can't
find it, so I recreated it (by a little hacking of the modules
each_recurse).
You can then
#printing the tags of the immediate children.
@doc = Document.new(File.new(format_file))
@doc.elements.each("definitions") do |element|
element.each_child_element do |childElement|
print "<", childElement.name.to_s, ">"
end
end
or recursively walk the tree by calling each_child_element for each
returned childElement (as with the first example)
def recurse(the_element)
the_element.each_child_element do |childElement|
print "<", childElement.name.to_s, ">"
recurse(childElement)
end
end
@doc.elements.each("definitions/src") do |element|
recurse(element)
end
On 20/05/2006, at 9:06 AM, Brian Cowdery wrote:
> Recently at work we've decided to attempt to build a basic XML driven
> automation framework to work with Watir (a web development testing
> library for ruby).
>
> I cant figure out how to loop through each level of the REXML document
> to extract the data needed to build the complete object.
>
> It seems that if i try to use any iterators on a root.elements[]
> object
> it converts it to text so i can't nest another iterator or loop to
> access the innards.
>
> my only recourse has been to resort to a ton of nested while loops
> which
> is ugly when compared to most other ruby loops.
>
> eg.
> i = 1
> while root.elements['cases'].elements[i] != nil
>
> n = 1
> while root.elements['cases'].elements['test-case'] != nil
>
> #more loops here. continue down the chain until i can build the
> #object from the inside out.
>
> i = i+i
> end
>
> i = i+i
> end
>
>
>
> my xml looks like this
> <script>
> <project-name></project-name>
> <start-url></start-url>
>
> <test-case id="1">
> <test-step id="1">
> <test>
> <interaction>double click</interaction>
> <element>
> <name>button 1</type>
> <type>button</type>
> <element>
> </test>
> <check>
> <element>
> <name>Page title</type>
> <type>text</type>
> <element>
> </check>
> </test-step>
>
> <test-step id="2">
> ...
> </test-step>
> </test-case>
>
> <test-case id="2">
> ...
> </test-case>
> </script>
>
> somehow i have to get THAT modeled into an object
> script object contains test-cases, test-cases contain test-steps
> etc....
>
> Any thoughts? (sorry for the long post... its kinda hard to explain
> without showing EVERYTHING.
>
> --
> Posted via http://www.ruby-forum.com/.
>