class SOAP::Parser
Attributes
allow_unqualified_element[RW]
decode_typemap[RW]
default_encodingstyle[RW]
envelopenamespace[RW]
Public Class Methods
new(opt = {})
click to toggle source
# File lib/soap/parser.rb, line 68 def initialize(opt = {}) @opt = opt @parser = XSD::XMLParser.create_parser(self, opt) @parsestack = nil @lastnode = nil @handlers = {} @envelopenamespace = opt[:envelopenamespace] || EnvelopeNamespace @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace @decode_typemap = opt[:decode_typemap] || nil @allow_unqualified_element = opt[:allow_unqualified_element] || false end
Public Instance Methods
characters(text)
click to toggle source
# File lib/soap/parser.rb, line 135 def characters(text) lastframe = @parsestack.last if lastframe # Need not to be cloned because character does not have attr. decode_text(lastframe.ns, text, lastframe.encodingstyle) else # Ignore Text outside of SOAP Envelope. p text if $DEBUG end end
charset()
click to toggle source
# File lib/soap/parser.rb, line 80 def charset @parser.charset end
end_element(name)
click to toggle source
# File lib/soap/parser.rb, line 146 def end_element(name) lastframe = @parsestack.pop unless name == lastframe.name raise UnexpectedElementError.new("Closing element name '#{ name }' does not match with opening element '#{ lastframe.name }'.") end decode_tag_end(lastframe.ns, lastframe.node, lastframe.encodingstyle) @lastnode = lastframe.node.node end
parse(string_or_readable)
click to toggle source
# File lib/soap/parser.rb, line 84 def parse(string_or_readable) @parsestack = [] @lastnode = nil @handlers.each do |uri, handler| handler.decode_prologue end @parser.do_parse(string_or_readable) unless @parsestack.empty? raise FormatDecodeError.new("Unbalanced tag in XML.") end @handlers.each do |uri, handler| handler.decode_epilogue end @lastnode end
start_element(name, attrs)
click to toggle source
# File lib/soap/parser.rb, line 105 def start_element(name, attrs) lastframe = @parsestack.last ns = parent = parent_encodingstyle = nil if lastframe ns = lastframe.ns.clone_ns parent = lastframe.node parent_encodingstyle = lastframe.encodingstyle else ns = XSD::NS.new parent = ParseFrame::NodeContainer.new(nil) parent_encodingstyle = nil end attrs = XSD::XMLParser.filter_ns(ns, attrs) encodingstyle = find_encodingstyle(ns, attrs) # Children's encodingstyle is derived from its parent. if encodingstyle.nil? if parent.node.is_a?(SOAPHeader) encodingstyle = LiteralNamespace else encodingstyle = parent_encodingstyle || @default_encodingstyle end end node = decode_tag(ns, name, attrs, parent, encodingstyle) @parsestack << ParseFrame.new(ns, name, node, encodingstyle) end
Private Instance Methods
decode_soap_envelope(ns, ele, attrs, parent)
click to toggle source
# File lib/soap/parser.rb, line 206 def decode_soap_envelope(ns, ele, attrs, parent) o = nil if ele.name == EleEnvelope o = SOAPEnvelope.new if ext = @opt[:external_content] ext.each do |k, v| o.external_content[k] = v end end elsif ele.name == EleHeader unless parent.node.is_a?(SOAPEnvelope) raise FormatDecodeError.new("Header should be a child of Envelope.") end o = SOAPHeader.new parent.node.header = o elsif ele.name == EleBody unless parent.node.is_a?(SOAPEnvelope) raise FormatDecodeError.new("Body should be a child of Envelope.") end o = SOAPBody.new parent.node.body = o elsif ele.name == EleFault unless parent.node.is_a?(SOAPBody) raise FormatDecodeError.new("Fault should be a child of Body.") end o = SOAPFault.new parent.node.fault = o end o end
decode_tag(ns, name, attrs, parent, encodingstyle)
click to toggle source
# File lib/soap/parser.rb, line 166 def decode_tag(ns, name, attrs, parent, encodingstyle) ele = ns.parse(name) # Envelope based parsing. if ((ele.namespace == @envelopenamespace) || (@allow_unqualified_element && ele.namespace.nil?)) o = decode_soap_envelope(ns, ele, attrs, parent) return o if o end # Encoding based parsing. handler = find_handler(encodingstyle) if handler return handler.decode_tag(ns, ele, attrs, parent) else raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") end end
decode_tag_end(ns, node, encodingstyle)
click to toggle source
# File lib/soap/parser.rb, line 185 def decode_tag_end(ns, node, encodingstyle) return unless encodingstyle handler = find_handler(encodingstyle) if handler return handler.decode_tag_end(ns, node) else raise FormatDecodeError.new("Unknown encodingStyle: #{ encodingstyle }.") end end
decode_text(ns, text, encodingstyle)
click to toggle source
# File lib/soap/parser.rb, line 196 def decode_text(ns, text, encodingstyle) handler = find_handler(encodingstyle) if handler handler.decode_text(ns, text) else # How should I do? end end
find_encodingstyle(ns, attrs)
click to toggle source
# File lib/soap/parser.rb, line 157 def find_encodingstyle(ns, attrs) attrs.each do |key, value| if (ns.compare(@envelopenamespace, AttrEncodingStyle, key)) return value end end nil end
find_handler(encodingstyle)
click to toggle source
# File lib/soap/parser.rb, line 237 def find_handler(encodingstyle) unless @handlers.key?(encodingstyle) handler_factory = SOAP::EncodingStyle::Handler.handler(encodingstyle) || SOAP::EncodingStyle::Handler.handler(EncodingNamespace) handler = handler_factory.new(@parser.charset) handler.decode_typemap = @decode_typemap handler.decode_prologue @handlers[encodingstyle] = handler end @handlers[encodingstyle] end