416: def self.from_xml(xml)
417: stack = []
418: parser = REXML::Parsers::BaseParser.new(xml)
419:
420: while true
421: event = parser.pull
422: case event[0]
423: when :end_document
424: break
425: when :end_doctype, :start_doctype
426:
427: when :start_element
428: stack.push REXMLUtilityNode.new(event[1], event[2])
429: when :end_element
430: if stack.size > 1
431: temp = stack.pop
432: stack.last.add_node(temp)
433: end
434: when :text, :cdata
435: stack.last.add_node(event[1]) unless event[1].strip.length == 0
436: end
437: end
438: stack.pop.to_hash
439: end