# XML file processing using REXML (beginner's question)

**URL:** <https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228>\
**Category:** Ruby\
**Created:** [July 12, 2007, 3:59pm UTC](https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228 "2007-07-12T15:59:20Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![ronaldfischer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/67e7ee/32.png) [@ronaldfischer](https://www.ruby-forum.com/u/ronaldfischer)\
**Post date:** [July 12, 2007, 3:59pm UTC](https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228/1 "2007-07-12T15:59:20Z")

</div>

Hello!

I try to understand REXML using the tutorial in

[http://www.germane-software.com/software/rexml/docs/tutorial.html](http://www.germane-software.com/software/rexml/docs/tutorial.html)

However, I have problems applying the path expressions to my  
application.  
Consider for example the following program, and in particular the last  
line:

#!/usr/bin/ruby  
require “rexml/document”  
require ‘pp’  
source=\<\<ENDXML  
ns:toplevel  
\<ns:request requestID=“1”\>  
\<ns:application aid=“demo-a”\>  
\</ns:application\>  
\</ns:request\>  
\<ns:request requestID=“2”\>  
\<ns:application aid=“demo-b”\>  
\</ns:application\>  
\</ns:request\>  
\</ns:toplevel\>  
ENDXML  
doc=REXML::Document.new source  
doc.elements.each(“ns:toplevel/ns:request”) { |element| puts  
element.attributes[“requestID”] }  
root=doc.root  
pp root.elements[“ns:toplevel/ns:request[@requestID=‘2’]”]

The program outputs

1  
2  
nil

that is, it finds the two elements “request” and correctly outputs their  
attribute  
requestID, but when I try to locate request number two with the path  
expression

ns:toplevel/ns:request[@requestID=‘2’]

it is not found. What am I doing wrong here?

Ronald

---

<div class="post-metadata">

**Author:** ![ronaldfischer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/67e7ee/32.png) [@ronaldfischer](https://www.ruby-forum.com/u/ronaldfischer)\
**Post date:** [July 12, 2007, 6:22pm UTC](https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228/2 "2007-07-12T18:22:43Z")

</div>

On 7/12/07, Ronald F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> <ns:application aid="demo-b">
> 
> ```
> 
> The program outputs  
> ns:toplevel/ns:request[@requestID=‘2’]
> 
> it is not found. What am I doing wrong here?

Your root variable represents your ns:toplevel so, either of these  
would return an object instead of nil …

pp root.elements[“ns:request[@requestID=‘2’]”]  
pp doc.elements[“ns:toplevel/ns:request[@requestID=‘2’]”]

Todd

---

<div class="post-metadata">

**Author:** ![ronaldfischer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/67e7ee/32.png) [@ronaldfischer](https://www.ruby-forum.com/u/ronaldfischer)\
**Post date:** [July 12, 2007, 7:22pm UTC](https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228/3 "2007-07-12T19:22:53Z")

</div>

On 7/12/07, Ronald F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Hello!
> 
> I try to understand REXML using the tutorial in

Hi,

You seem comfortable with XPath, so let me strongly encourage the  
methods defined in the REXML::XPath class instead of the []-based  
methods.

[http://www.germane-software.com/software/XML/rexml/doc/classes/REXML/XPath.html](http://www.germane-software.com/software/XML/rexml/doc/classes/REXML/XPath.html)

$ cat rbtalk.rb  
#!/usr/bin/env ruby  
require “rexml/document”  
source=\<\<ENDXML  
ns:toplevel  
\<ns:request requestID=“1”\>  
\<ns:application aid=“demo-a”\>  
\</ns:application\>  
\</ns:request\>  
\<ns:request requestID=“2”\>  
\<ns:application aid=“demo-b”\>  
\</ns:application\>  
\</ns:request\>  
\</ns:toplevel\>  
ENDXML  
doc = REXML::Document.new source  
REXML::XPath.each(doc, “/ns:toplevel/ns:request”) {|element|  
puts element.attributes[“requestID”]  
}  
p REXML::XPath.match(doc, “/ns:toplevel/ns:request[@requestID=‘2’]”)

$ ruby ./rbtalk.rb  
1  
2  
[\<ns:request requestID=‘2’\> … \</\>]

HTH,  
Keith

---

<div class="post-metadata">

**Author:** ![ronaldfischer](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/67e7ee/32.png) [@ronaldfischer](https://www.ruby-forum.com/u/ronaldfischer)\
**Post date:** [July 13, 2007, 9:48am UTC](https://www.ruby-forum.com/t/xml-file-processing-using-rexml-beginners-question/109228/4 "2007-07-13T09:48:26Z")

</div>

> You seem comfortable with XPath, so let me strongly encourage the  
> methods defined in the REXML::XPath class instead of the []-based  
> methods.

> REXML::XPath.each(doc, “/ns:toplevel/ns:request”) {|element|  
> puts element.attributes[“requestID”]  
> }  
> p REXML::XPath.match(doc, “/ns:toplevel/ns:request[@requestID=‘2’]”)

Thanks a lot for the suggestion!

(And also thanks to Todd B. for pointing out my error).

Ronald
