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