Class: OXML::Parser
- Inherits:
-
Object
- Object
- OXML::Parser
- Defined in:
- lib/oxml/parser.rb
Constant Summary collapse
- EMPTY_STR =
''
- TRUE_STR =
'true'
- FALSE_STR =
'false'
- DATE_TIME =
/^-?\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/.freeze
- DATE =
/^-?\d{4}-\d{2}-\d{2}(?:Z|[+-]\d{2}:?\d{2})?$/.freeze
- TIME =
/^\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/.freeze
Instance Method Summary collapse
- #attr(name, str) ⇒ Object
- #attrs_done ⇒ Object
- #end_element(_name) ⇒ Object
-
#initialize(options = {}) ⇒ Parser
constructor
A new instance of Parser.
- #start_element(name) ⇒ Object
- #text(value) ⇒ Object
- #to_h ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Parser
Returns a new instance of Parser.
12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/oxml/parser.rb', line 12 def initialize( = {}) @memo = {} @arr = [] @map = {} @name = nil @last_attr = nil @strip_namespaces = .fetch(:strip_namespaces, false) @delete_namespace_attributes = .fetch(:delete_namespace_attributes, false) @advanced_typecasting = .fetch(:advanced_typecasting, false) @skip_soap_elements = .fetch(:skip_soap_elements, false) end |
Instance Method Details
#attr(name, str) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/oxml/parser.rb', line 30 def attr(name, str) @last_attr = "#{name}:#{str}" return if @delete_namespace_attributes return if name == :version return if name == :encoding start_element("@#{name}") text(str) end_element(name) end |
#attrs_done ⇒ Object
58 59 60 61 62 63 |
# File 'lib/oxml/parser.rb', line 58 def attrs_done if @last_attr =~ /nil:true/ @last_attr = nil @arr.last[@name] = nil end end |
#end_element(_name) ⇒ Object
65 66 67 |
# File 'lib/oxml/parser.rb', line 65 def end_element(_name) @memo = @arr.pop end |
#start_element(name) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/oxml/parser.rb', line 42 def start_element(name) name = name.to_s @arr.push(@memo) if @strip_namespaces && name.start_with?('@') @name = name.to_sym elsif @strip_namespaces @name = @map[name] ||= Utils.snakecase(name).split(':').last.to_sym else @name = @map[name] ||= Utils.snakecase(name).to_sym end @memo = {} text(@memo) end |
#text(value) ⇒ Object
69 70 71 72 73 74 75 76 77 78 |
# File 'lib/oxml/parser.rb', line 69 def text(value) if @arr.last[@name].is_a?(Array) @arr.last[@name].pop unless value == @memo @arr.last[@name] << cast(value) elsif @arr.last[@name] && value == @memo @arr.last[@name] = [@arr.last[@name], value] else @arr.last[@name] = cast(value) end end |
#to_h ⇒ Object
24 25 26 27 28 |
# File 'lib/oxml/parser.rb', line 24 def to_h return @memo.to_h unless @skip_soap_elements @memo.to_h.values.first&.values&.last end |