I wrote something similar a while ago
http://github.com/casualjim/ironnails/tree/master/IronNails/vendor/iron_nails/lib/iron_xml.rb
statuses = []
IronXml.parse('friends_timeline.xml', :document) do |doc|
doc.elements('statuses') do |status|
st = Status.new
st.id = status.element('id').value
st.created_at = status.element('created_at').value
st.text = status.element('text').value
st.source = status.element('source').value
st.truncated = status.element('truncated').value
st.in_reply_to_status_id = status.element('in_reply_to_status_id').value
st.in_reply_to_user_id = status.element('in_reply_to_user_id').value
st.favorited = status.element('favorited').value
status.elements('user') do |user|
# process user here
end
statuses << st
end
end
or
statuses = []
IronXml.parse('friends_timeline.xml', :document) do |doc|
doc.statuses do |status|
st = Status.new
st.id = status.id
st.created_at = status.created_at
st.text = status.text
st.source = status.source
st.truncated = status.truncated
st.in_reply_to_status_id = status.in_reply_to_status_id
st.in_reply_to_user_id = status.in_reply_to_user_id
st.favorited = status.favorited
status.user do |user|
# process user here
end
statuses << st
end
end
You can maybe look there for inspiration :)
On Thu, Jan 1, 2009 at 6:48 PM, Ben Hall <[email protected]> wrote:
> Hello,
>
> I've just been playing around with IronRuby and processing some XML
> from a REST service. I've created this wrapper:
> require 'mscorlib'
> require 'System, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089'
> include System
> require 'System.Xml, Version=2.0.0.0, Culture=neutral,
> PublicKeyToken=b77a5c561934e089'
> include System::Xml
>
> #Wrapper around .Net XMLDocument to make it easier to query with -
> more like REXML
> class Document
> def initialize(xml)
> @document = XmlDocument.new
> @document.load_xml xml
> end
>
> def get(xpath) #.collect - I want to pass the block in, not have
> to use it on the outside.
> @document.SelectNodes(xpath)
> end
> end
>
> class XmlNodeList
> def get(name)
> list.select {|e| e.Name == name}
> end
> end
>
> class XmlElement
> def get(name)
> if has_attribute name
> get_attribute name
> else
> get_elements_by_tag_name name
> end
> end
>
> def text
> inner_text
> end
> end
>
> My first problem is that I'm getting XmlElement object instead of
> XmlNode from an XmlNodeList. If I had XmlNode, then I could do
> e['n'].text - which is what I want. As a result, my code to access
> the N element looks like this:
>
> require 'xml'
> @document = Document.new('<x><x1><n>test</n><z>aaa</z></x1></x>')
> @document.get('x').collect {|n| puts n.text}
> >> testaaa
>
> >>> @document.get('x/x1').collect {|e| e.get('n').collect {|n| puts
> n.text}}
> test
>
> Why am I getting a XmlElement object? How can I access my xml in a
> cleaner fashion?
>
>
> My second problem, I wanted to be able to pass in a block
>
> def get(xpath)
> @document.SelectNodes(xpath).collect {yield}
> end
>
> In this case, I get the following error:
> >>> @document.get('x') {|n| puts n.text}
> :1: undefined method `text' for nil:NilClass (NoMethodError)
> from xml.rb:27:in `get'
>
> I changed it to {|n| yield}, but I get the same error. The object is
> always nil. What am I doing wrong?
>
> Hope this all makes sense.
>
> Thanks
>
> Ben
> _______________________________________________
> Ironruby-core mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
_______________________________________________
Ironruby-core mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/ironruby-core