| Class | WSDL::Parser |
| In: |
lib/wsdl/parser.rb
|
| Parent: | Object |
# File lib/wsdl/parser.rb, line 52
52: def initialize(opt = {})
53: @parser = XSD::XMLParser.create_parser(self, opt)
54: @parsestack = nil
55: @lastnode = nil
56: @ignored = {}
57: @location = opt[:location]
58: @originalroot = opt[:originalroot]
59: end
# File lib/wsdl/parser.rb, line 88
88: def characters(text)
89: lastframe = @parsestack.last
90: if lastframe
91: # Need not to be cloned because character does not have attr.
92: ns = lastframe.ns
93: decode_text(ns, text)
94: else
95: p text if $DEBUG
96: end
97: end
# File lib/wsdl/parser.rb, line 99
99: def end_element(name)
100: lastframe = @parsestack.pop
101: unless name == lastframe.name
102: raise UnexpectedElementError.new("closing element name '#{name}' does not match with opening element '#{lastframe.name}'")
103: end
104: decode_tag_end(lastframe.ns, lastframe.node)
105: @lastnode = lastframe.node
106: end
# File lib/wsdl/parser.rb, line 61
61: def parse(string_or_readable)
62: @parsestack = []
63: @lastnode = nil
64: @textbuf = ''
65: @parser.do_parse(string_or_readable)
66: @lastnode
67: end
# File lib/wsdl/parser.rb, line 73
73: def start_element(name, attrs)
74: lastframe = @parsestack.last
75: ns = parent = nil
76: if lastframe
77: ns = lastframe.ns.clone_ns
78: parent = lastframe.node
79: else
80: ns = XSD::NS.new
81: parent = nil
82: end
83: attrs = XSD::XMLParser.filter_ns(ns, attrs)
84: node = decode_tag(ns, name, attrs, parent)
85: @parsestack << ParseFrame.new(ns, name, node)
86: end
# File lib/wsdl/parser.rb, line 110
110: def decode_tag(ns, name, attrs, parent)
111: o = nil
112: elename = ns.parse(name)
113: if !parent
114: if elename == DefinitionsName
115: o = Definitions.parse_element(elename)
116: o.location = @location
117: else
118: raise UnknownElementError.new("unknown element: #{elename}")
119: end
120: o.root = @originalroot if @originalroot # o.root = o otherwise
121: else
122: if elename == XMLSchema::AnnotationName
123: # only the first annotation element is allowed for each xsd element.
124: o = XMLSchema::Annotation.new
125: else
126: o = parent.parse_element(elename)
127: end
128: unless o
129: unless @ignored.key?(elename)
130: warn("ignored element: #{elename}")
131: @ignored[elename] = elename
132: end
133: o = Documentation.new # which accepts any element.
134: end
135: # node could be a pseudo element. pseudo element has its own parent.
136: o.root = parent.root
137: o.parent = parent if o.parent.nil?
138: end
139: attrs.each do |key, value|
140: attr_ele = ns.parse(key, true)
141: value_ele = ns.parse(value, true)
142: value_ele.source = value # for recovery; value may not be a QName
143: unless o.parse_attr(attr_ele, value_ele)
144: unless @ignored.key?(attr_ele)
145: warn("ignored attr: #{attr_ele}")
146: @ignored[attr_ele] = attr_ele
147: end
148: end
149: end
150: o
151: end
# File lib/wsdl/parser.rb, line 153
153: def decode_tag_end(ns, node)
154: node.parse_epilogue
155: end