Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/common.rb

Overview

Class Method Summary collapse

Class Method Details

.from_xml(xml_io) ⇒ Object



211
212
213
214
215
216
217
218
# File 'lib/common.rb', line 211

def from_xml(xml_io)
  begin
    result = Nokogiri::XML(xml_io)
    return { result.root.name.to_sym => xml_node_to_hash(result.root)}
  rescue Exception => e
    # raise your custom exception here
  end
end

.xml_node_to_hash(node) ⇒ Object



220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/common.rb', line 220

def xml_node_to_hash(node)
  # If we are at the root of the document, start the hash 
  if node.element?
    result_hash = {}
    if node.attributes != {}
      attributes = {}
      node.attributes.keys.each do |key|
        attributes[node.attributes[key].name.to_sym] = node.attributes[key].value
      end
    end
    if node.children.size > 0
      node.children.each do |child|
        result = xml_node_to_hash(child)

        if child.name == "text"
          unless child.next_sibling || child.previous_sibling
            return result unless attributes
            result_hash[child.name.to_sym] = result
          end
        elsif result_hash[child.name.to_sym]

          if result_hash[child.name.to_sym].is_a?(Object::Array)
             result_hash[child.name.to_sym] << result
          else
             result_hash[child.name.to_sym] = [result_hash[child.name.to_sym]] << result
          end
        else
          result_hash[child.name.to_sym] = result
        end
      end
      if attributes
         #add code to remove non-data attributes e.g. xml schema, namespace here
         #if there is a collision then node content supersets attributes
         result_hash = attributes.merge(result_hash)
      end
      return result_hash
    else
      return attributes
    end
  else
    return node.content.to_s
  end
end