class WSDL::Parser

Public Class Methods

new(opt = {}) click to toggle source
# File lib/wsdl/parser.rb, line 53
def initialize(opt = {})
  @parser = XSD::XMLParser.create_parser(self, opt)
  @parsestack = nil
  @lastnode = nil
  @ignored = {}
  @location = opt[:location]
  @originalroot = opt[:originalroot]
end

Public Instance Methods

characters(text) click to toggle source
# File lib/wsdl/parser.rb, line 90
def characters(text)
  lastframe = @parsestack.last
  if lastframe
    # Need not to be cloned because character does not have attr.
    ns = lastframe.ns
    decode_text(ns, text)
  else
    p text if $DEBUG
  end
end
charset() click to toggle source
# File lib/wsdl/parser.rb, line 70
def charset
  @parser.charset
end
end_element(name) click to toggle source
# File lib/wsdl/parser.rb, line 101
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)
  @lastnode = lastframe.node
end
parse(string_or_readable) click to toggle source
# File lib/wsdl/parser.rb, line 62
def parse(string_or_readable)
  @parsestack = []
  @lastnode = nil
  @textbuf = ''
  @parser.do_parse(string_or_readable)
  @lastnode
end
start_element(name, attrs) click to toggle source
# File lib/wsdl/parser.rb, line 74
def start_element(name, attrs)
  lastframe = @parsestack.last
  ns = parent = nil
  if lastframe
    ns = lastframe.ns
    parent = lastframe.node
  else
    ns = ::SOAP::NS.new
    parent = nil
  end
  # ns might be the same
  ns, attrs = XSD::XMLParser.filter_ns(ns, attrs)
  node = decode_tag(ns, name, attrs, parent)
  @parsestack << ParseFrame.new(ns, name, node)
end

Private Instance Methods

decode_tag(ns, name, attrs, parent) click to toggle source
# File lib/wsdl/parser.rb, line 112
def decode_tag(ns, name, attrs, parent)
  o = nil
  elename = ns.parse(name)
  if !parent
    if elename == DefinitionsName
      o = Definitions.parse_element(elename)
      o.location = @location
    else
      raise UnknownElementError.new("unknown element: #{elename}")
    end
    o.root = @originalroot if @originalroot   # o.root = o otherwise
  else
    if elename == XMLSchema::AnnotationName
      # only the first annotation element is allowed for each xsd element.
      o = XMLSchema::Annotation.new
    else
      o = parent.parse_element(elename)
    end
    if o.nil?
      unless @ignored.key?(elename)
        warn("ignored element: #{elename}")
        @ignored[elename] = elename
      end
      o = Documentation.new  # which accepts any element.
    end
    # node could be a pseudo element.  pseudo element has its own parent.
    o.root = parent.root
    o.parent = parent if o.parent.nil?
  end
  to_array_and_splice_name_to_first(attrs).each do |attr|
    key = attr[:key]
    value = attr[:value]
    attr_ele = ns.parse(key, true)
    value_ele = ns.parse(value, false)
    value_ele.source = value  # for recovery; value may not be a QName
    if o.parse_attr(attr_ele, value_ele).nil?
      unless @ignored.key?(attr_ele)
        warn("ignored attr: #{attr_ele}")
        @ignored[attr_ele] = attr_ele
      end
    end
  end
  o
end
decode_tag_end(ns, node) click to toggle source
# File lib/wsdl/parser.rb, line 157
def decode_tag_end(ns, node)
  node.parse_epilogue
end
decode_text(ns, text) click to toggle source
# File lib/wsdl/parser.rb, line 161
def decode_text(ns, text)
  @textbuf << text
end
to_array_and_splice_name_to_first(attrs) click to toggle source
# File lib/wsdl/parser.rb, line 165
def to_array_and_splice_name_to_first(attrs)
  attrs_name = []
  attrs_other = []
  attrs.each do |key, value|
    if key == "name"
      attrs_name << { :key => key, :value => value }
    elsif
      attrs_other << { :key => key, :value => value }
    end
  end
  attrs_name.concat(attrs_other)
end