source: extensions/gsdl-video/trunk/installed/cmdline/lib/ruby/1.8/wsdl/parser.rb@ 18425

Last change on this file since 18425 was 18425, checked in by davidb, 15 years ago

Video extension to Greenstone

File size: 3.9 KB
Line 
1# WSDL4R - WSDL XML Instance parser library.
2# Copyright (C) 2002, 2003, 2005 NAKAMURA, Hiroshi <[email protected]>.
3
4# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5# redistribute it and/or modify it under the same terms of Ruby's license;
6# either the dual license version in 2003, or any later version.
7
8
9require 'xsd/qname'
10require 'xsd/ns'
11require 'xsd/charset'
12require 'xsd/datatypes'
13require 'xsd/xmlparser'
14require 'wsdl/wsdl'
15require 'wsdl/data'
16require 'wsdl/xmlSchema/data'
17require 'wsdl/soap/data'
18
19
20module WSDL
21
22
23class Parser
24 include WSDL
25
26 class ParseError < Error; end
27 class FormatDecodeError < ParseError; end
28 class UnknownElementError < FormatDecodeError; end
29 class UnknownAttributeError < FormatDecodeError; end
30 class UnexpectedElementError < FormatDecodeError; end
31 class ElementConstraintError < FormatDecodeError; end
32 class AttributeConstraintError < FormatDecodeError; end
33
34private
35
36 class ParseFrame
37 attr_reader :ns
38 attr_reader :name
39 attr_accessor :node
40
41 private
42
43 def initialize(ns, name, node)
44 @ns = ns
45 @name = name
46 @node = node
47 end
48 end
49
50public
51
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
60
61 def parse(string_or_readable)
62 @parsestack = []
63 @lastnode = nil
64 @textbuf = ''
65 @parser.do_parse(string_or_readable)
66 @lastnode
67 end
68
69 def charset
70 @parser.charset
71 end
72
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
87
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
98
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
107
108private
109
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
152
153 def decode_tag_end(ns, node)
154 node.parse_epilogue
155 end
156
157 def decode_text(ns, text)
158 @textbuf << text
159 end
160end
161
162
163end
Note: See TracBrowser for help on using the repository browser.