Class: Serialbench::Serializers::Xml::LibxmlSerializer::StreamingHandler

Inherits:
Object
  • Object
show all
Includes:
LibXML::XML::SaxParser::Callbacks
Defined in:
lib/serialbench/serializers/xml/libxml_serializer.rb

Overview

SAX handler for streaming

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ StreamingHandler

Returns a new instance of StreamingHandler.



94
95
96
97
98
99
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 94

def initialize(&block)
  @block = block
  @elements_processed = 0
  @current_element = nil
  @element_stack = []
end

Instance Attribute Details

#elements_processedObject (readonly)

Returns the value of attribute elements_processed.



92
93
94
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 92

def elements_processed
  @elements_processed
end

Instance Method Details

#on_cdata_block(cdata) ⇒ Object



123
124
125
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 123

def on_cdata_block(cdata)
  @element_stack.last[:text] += cdata if @element_stack.any?
end

#on_characters(chars) ⇒ Object



117
118
119
120
121
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 117

def on_characters(chars)
  return if chars.strip.empty?

  @element_stack.last[:text] += chars if @element_stack.any?
end

#on_end_element(_element) ⇒ Object



108
109
110
111
112
113
114
115
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 108

def on_end_element(_element)
  element_data = @element_stack.pop
  if @element_stack.empty?
    @block&.call(element_data)
  else
    @element_stack.last[:children] << element_data
  end
end

#on_start_element(element, attributes) ⇒ Object



101
102
103
104
105
106
# File 'lib/serialbench/serializers/xml/libxml_serializer.rb', line 101

def on_start_element(element, attributes)
  @elements_processed += 1
  attrs = Hash[attributes || []]
  @current_element = { name: element, attributes: attrs, children: [], text: '' }
  @element_stack.push(@current_element)
end