Class: EmuPower::StreamParser::Parser
- Inherits:
-
Nokogiri::XML::SAX::Document
- Object
- Nokogiri::XML::SAX::Document
- EmuPower::StreamParser::Parser
- Defined in:
- lib/emu_power/stream_parser.rb
Overview
Nokogiri parser definition. Processes a flat XML stream with multiple roots.
Instance Method Summary collapse
-
#characters(str) ⇒ Object
Populate the content of the current element.
-
#end_element(name, attrs = []) ⇒ Object
Close out the current tag and clear context.
-
#initialize(fakeroot, roots, &block) ⇒ Parser
constructor
Initialize the set of root tags to consider.
-
#start_element(name, attrs = []) ⇒ Object
For each tag, initialize a root element if we don’t already have one.
Constructor Details
#initialize(fakeroot, roots, &block) ⇒ Parser
Initialize the set of root tags to consider
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/emu_power/stream_parser.rb', line 38 def initialize(fakeroot, roots, &block) @roots = roots @current_object = nil @current_property = nil @current_root = nil @callback = block # All element parsers ignore this tag. This is only # used to persuade Nokogiri to parse multiple roots # in a single stream without getting mad. @fakeroot = fakeroot end |
Instance Method Details
#characters(str) ⇒ Object
Populate the content of the current element
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/emu_power/stream_parser.rb', line 72 def characters(str) if @current_object != nil && @current_property != nil #cur = @current_object[@current_property] #return if cur == str # Wrap into array if we already have a value (XML permits duplicates) #cur = [cur] unless cur == nil #if cur.kind_of?(Array) # cur << str #else # cur = str #end #@current_object[@current_property] = cur @current_object[@current_property] = str end end |
#end_element(name, attrs = []) ⇒ Object
Close out the current tag and clear context
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/emu_power/stream_parser.rb', line 95 def end_element(name, attrs = []) return if name == @fakeroot if @current_root == name if @callback != nil @callback.call(@current_object) else puts "DEBUG: #{@current_object}" end @current_object = nil @current_root = nil elsif @current_object != nil @current_property = nil end end |
#start_element(name, attrs = []) ⇒ Object
For each tag, initialize a root element if we don’t already have one. Otherwise, consider it a property of the current element.
57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/emu_power/stream_parser.rb', line 57 def start_element(name, attrs = []) return if name == @fakeroot return if @current_object == nil && !@roots.include?(name) if @current_object == nil @current_root = name @current_object = { "MessageType" => name } else @current_property = name end end |