Changeset 1891
- Timestamp:
- 07/20/07 00:08:51 (1 year ago)
- Files:
-
- trunk/RELEASE_en.html (modified) (1 diff)
- trunk/lib/wsdl/soap/classDefCreator.rb (modified) (4 diffs)
- trunk/lib/wsdl/soap/classDefCreatorSupport.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/encodedMappingRegistryCreator.rb (modified) (3 diffs)
- trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/mappingRegistryCreator.rb (modified) (2 diffs)
- trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb (modified) (6 diffs)
- trunk/lib/wsdl/xmlSchema/xsd2ruby.rb (modified) (4 diffs)
- trunk/lib/xsd/qname.rb (modified) (1 diff)
- trunk/test/wsdl/any/expectedEcho.rb (modified) (2 diffs)
- trunk/test/wsdl/marshal/person_org.rb (modified) (1 diff)
- trunk/test/wsdl/ref/expectedProduct.rb (modified) (9 diffs)
- trunk/test/wsdl/ref/test_ref.rb (modified) (1 diff)
- trunk/test/wsdl/simpletype/rpc/expectedEchoVersion.rb (modified) (1 diff)
- trunk/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb (modified) (8 diffs)
- trunk/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb (modified) (1 diff)
- trunk/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb (modified) (4 diffs)
- trunk/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb (modified) (2 diffs)
- trunk/test/xsd/xsd2ruby/expected_mysample.rb (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RELEASE_en.html
r1888 r1891 93 93 'Emil Marceta' for contributing a patch for one-way service support. 94 94 'Ernie' for contributing a helloworld WSDL sample and WSDL service feature of HTTPServer. 95 'Felipe Contreras' for contributing an union + memberType sample and patches for missing 'require'.95 'Felipe Contreras' for contributing an union + memberType sample, patches for missing 'require', and a patch to allow to customize default ns definition of SOAP Envelope. 96 96 'Greg Lappen' for contributing an eBaySvc sample. 97 97 'Ger Apeldoorn' for contributing a sample of complex type + MIME attachment. trunk/lib/wsdl/soap/classDefCreator.rb
r1865 r1891 10 10 require 'wsdl/soap/classDefCreatorSupport' 11 11 require 'xsd/codegen' 12 require 'set' 12 13 13 14 … … 35 36 @faulttypes = definitions.collect_faulttypes 36 37 end 38 @defined_const = {} 37 39 end 38 40 … … 284 286 init_params << "#{varname} = nil" 285 287 end 288 c.comment << "\n #{attrname} - #{create_type_name(element) || '(any)'}" 286 289 when WSDL::XMLSchema::Sequence 287 290 child_init_lines, child_init_params = … … 331 334 332 335 def define_attribute(c, attributes) 336 const = {} 337 unless attributes.empty? 338 c.def_method("__xmlattr") do <<-__EOD__ 339 @__xmlattr ||= {} 340 __EOD__ 341 end 342 end 333 343 attributes.each do |attribute| 334 344 name = name_attribute(attribute) 335 345 methodname = safemethodname('xmlattr_' + name.name) 346 constname = 'Attr' + safeconstname(name.name) 347 const[constname] ||= 0 348 if (const[constname] += 1) > 1 349 constname += "_#{const[constname]}" 350 end 351 c.def_const(constname, dqname(name)) 336 352 c.def_method(methodname) do <<-__EOD__ 337 (@__xmlattr ||= {})[#{dqname(name)}]353 __xmlattr[#{constname}] 338 354 __EOD__ 339 355 end 340 356 c.def_method(methodname + '=', 'value') do <<-__EOD__ 341 (@__xmlattr ||= {})[#{dqname(name)}] = value357 __xmlattr[#{constname}] = value 342 358 __EOD__ 343 359 end 360 c.comment << "\n #{methodname} - #{attribute_basetype(attribute) || '(any)'}" 344 361 end 345 362 end trunk/lib/wsdl/soap/classDefCreatorSupport.rb
r1827 r1891 17 17 18 18 19 # requires @defined_const and @modulepath 19 20 module ClassDefCreatorSupport 20 21 include XSD::CodeGen::GenSupport … … 81 82 82 83 def dqname(qname) 83 qname.dump 84 if @defined_const.key?(qname.namespace) 85 qname.dump(@defined_const[qname.namespace]) 86 else 87 qname.dump 88 end 89 end 90 91 def create_type_name(element) 92 if element.type == XSD::AnyTypeName 93 nil 94 elsif @simpletypes[element.type] 95 create_class_name(element.type, @modulepath) 96 elsif klass = element_basetype(element) 97 klass.name 98 elsif element.type 99 create_class_name(element.type, @modulepath) 100 elsif element.ref 101 create_class_name(element.ref, @modulepath) 102 else 103 nil 104 # nil means anyType. 105 # TODO: do we define a class for local complexType from it's name? 106 # create_class_name(element.name, @modulepath) 107 # 108 # <element> 109 # <complexType> 110 # <seq...> 111 # </complexType> 112 # </element> 113 end 84 114 end 85 115 trunk/lib/wsdl/soap/encodedMappingRegistryCreator.rb
r1824 r1891 20 20 attr_reader :definitions 21 21 22 def initialize(definitions, modulepath )22 def initialize(definitions, modulepath, defined_const) 23 23 @definitions = definitions 24 24 @modulepath = modulepath … … 28 28 @complextypes.uniq! 29 29 @varname = nil 30 @defined_const = defined_const 30 31 end 31 32 … … 94 95 arytype = typedef.find_arytype || XSD::AnyTypeName 95 96 type = XSD::QName.new(arytype.namespace, arytype.name.sub(/\[(?:,)*\]$/, '')) 97 assign_const(type.namespace, 'Ns') 96 98 return <<__EOD__ 97 99 #{@varname}.set( trunk/lib/wsdl/soap/literalMappingRegistryCreator.rb
r1865 r1891 18 18 include MappingRegistryCreatorSupport 19 19 20 def initialize(definitions, modulepath )20 def initialize(definitions, modulepath, defined_const) 21 21 @definitions = definitions 22 22 @modulepath = modulepath … … 30 30 @complextypes.uniq! 31 31 @varname = nil 32 @defined_const = defined_const 32 33 end 33 34 trunk/lib/wsdl/soap/mappingRegistryCreator.rb
r1855 r1891 29 29 30 30 def dump 31 encoded_creator = EncodedMappingRegistryCreator.new(@definitions, @modulepath) 32 literal_creator = LiteralMappingRegistryCreator.new(@definitions, @modulepath) 31 defined_const = {} 32 encoded_creator = EncodedMappingRegistryCreator.new(@definitions, @modulepath, defined_const) 33 literal_creator = LiteralMappingRegistryCreator.new(@definitions, @modulepath, defined_const) 33 34 wsdl_name = @definitions.name ? @definitions.name.name : 'default' 34 35 module_name = safeconstname(wsdl_name + 'MappingRegistry') … … 44 45 m.def_const(varname, '::SOAP::Mapping::LiteralRegistry.new') 45 46 m.def_code(literal_creator.dump(varname)) 47 # 48 defined_const.each do |ns, tag| 49 m.def_const(tag, dq(ns)) 50 end 46 51 m.dump 47 52 end trunk/lib/wsdl/soap/mappingRegistryCreatorSupport.rb
r1880 r1891 14 14 15 15 16 # requires @defined_const = {} 16 17 module MappingRegistryCreatorSupport 17 18 include ClassDefCreatorSupport … … 48 49 def dump_type(name, type) 49 50 if name 51 assign_const(name.namespace, 'Ns') 50 52 '[' + ndq(type) + ', ' + dqname(name) + ']' 51 53 else 52 54 ndq(type) 53 55 end 56 end 57 58 def assign_const(value, prefix = '') 59 return if value.nil? or @defined_const.key?(value) 60 name = value.scan(/[^:\/]+\z/)[0] || '' 61 tag = prefix + safeconstname(name) 62 if @defined_const.value?(tag) 63 idx = 0 64 while true 65 tag = prefix + safeconstname(name + "_#{idx}") 66 break unless @defined_const.value?(tag) 67 idx += 1 68 raise RuntimeError.new("too much similar names") if idx > 100 69 end 70 end 71 @defined_const[value] = tag 54 72 end 55 73 … … 77 95 schema_element << [varname, eleqname, type, occurrence] 78 96 when XMLSchema::Element 79 if element.type == XSD::AnyTypeName 80 type = nil 81 elsif @simpletypes[element.type] 82 type = create_class_name(element.type, @modulepath) 83 elsif klass = element_basetype(element) 84 type = klass.name 85 elsif element.type 86 type = create_class_name(element.type, @modulepath) 87 elsif element.ref 88 next if element.ref == SchemaName 89 type = create_class_name(element.ref, @modulepath) 90 else 91 type = nil # means anyType. 92 # do we define a class for local complexType from it's name? 93 # type = create_class_name(element.name, @modulepath) 94 # <element> 95 # <complexType> 96 # <seq...> 97 # </complexType> 98 # </element> 99 end 97 next if element.ref == SchemaName 98 type = create_type_name(element) 100 99 name = name_element(element).name 101 100 varname = safevarname(name) … … 171 170 "{\n " + 172 171 schema_attribute.collect { |name, type| 172 assign_const(name.namespace, 'Ns') 173 173 dqname(name) + ' => ' + ndq(type) 174 174 }.join(",\n ") + … … 206 206 if var.key?(key) 207 207 if as_string 208 ":#{key} => #{ndq(var[key])}" 208 if @defined_const.key?(var[key]) 209 ":#{key} => #{@defined_const[var[key]]}" 210 else 211 ":#{key} => #{ndq(var[key])}" 212 end 209 213 else 210 214 ":#{key} => #{var[key]}" … … 245 249 var[:schema_ns] = qname.namespace 246 250 end 251 assign_const(var[:schema_ns], 'Ns') 247 252 dump_entry(@varname, var) 248 253 end trunk/lib/wsdl/xmlSchema/xsd2ruby.rb
r1857 r1891 10 10 require 'wsdl/xmlSchema/importer' 11 11 require 'wsdl/soap/classDefCreator' 12 require 'wsdl/soap/classDefCreatorSupport' 12 13 require 'wsdl/soap/literalMappingRegistryCreator' 13 14 require 'logger' … … 19 20 20 21 class XSD2Ruby 22 include WSDL::SOAP::ClassDefCreatorSupport 23 21 24 attr_accessor :location 22 25 attr_reader :opt … … 79 82 80 83 def dump_mapping_registry 81 creator = WSDL::SOAP::LiteralMappingRegistryCreator.new(@xsd, @modulepath) 84 defined_const = {} 85 creator = WSDL::SOAP::LiteralMappingRegistryCreator.new(@xsd, @modulepath, defined_const) 82 86 module_name = XSD::CodeGen::GenSupport.safeconstname( 83 87 @name + 'MappingRegistry') … … 91 95 m.def_const(varname, '::SOAP::Mapping::LiteralRegistry.new') 92 96 m.def_code(creator.dump(varname)) 97 # 98 defined_const.each do |ns, tag| 99 m.def_const(tag, dq(ns)) 100 end 93 101 m.dump 94 102 end trunk/lib/xsd/qname.rb
r1824 r1891 25 25 end 26 26 27 def dump 28 ns = @namespace.nil? ? 'nil' : @namespace.dump 27 def dump(predefined_ns = nil) 28 ns = predefined_ns 29 ns ||= @namespace.nil? ? 'nil' : @namespace.dump 29 30 name = @name.nil? ? 'nil' : @name.dump 30 31 "XSD::QName.new(#{ns}, #{name})" trunk/test/wsdl/any/expectedEcho.rb
r1790 r1891 5 5 6 6 # {urn:example.com:echo-type}foo.bar 7 # before - SOAP::SOAPString 8 # after - SOAP::SOAPString 7 9 class FooBar 8 10 attr_accessor :before … … 22 24 23 25 # {urn:example.com:echo-type}setOutputAndCompleteRequest 26 # taskId - SOAP::SOAPString 27 # data - (any) 28 # participantToken - SOAP::SOAPString 24 29 class SetOutputAndCompleteRequest 25 30 attr_accessor :taskId trunk/test/wsdl/marshal/person_org.rb
r1731 r1891 2 2 3 3 # {http://www.jin.gr.jp/~nahi/xmlns/sample/Person}Person 4 # familyname - SOAP::SOAPString 5 # givenname - SOAP::SOAPString 6 # var1 - SOAP::SOAPInt 7 # var2 - SOAP::SOAPDouble 8 # var3 - SOAP::SOAPString 4 9 class Person 5 10 attr_accessor :familyname trunk/test/wsdl/ref/expectedProduct.rb
r1788 r1891 1 1 require 'xsd/qname' 2 2 3 module WSDL::Ref 4 5 3 6 # {urn:ref}Product 7 # name - SOAP::SOAPString 8 # rating - SOAP::SOAPString 4 9 class Product 5 10 attr_accessor :name … … 13 18 14 19 # {urn:ref}Comment 20 # xmlattr_msgid - SOAP::SOAPString 15 21 class Comment < ::String 22 AttrMsgid = XSD::QName.new(nil, "msgid") 23 24 def __xmlattr 25 @__xmlattr ||= {} 26 end 27 16 28 def xmlattr_msgid 17 (@__xmlattr ||= {})[XSD::QName.new(nil, "msgid")]29 __xmlattr[AttrMsgid] 18 30 end 19 31 20 32 def xmlattr_msgid=(value) 21 (@__xmlattr ||= {})[XSD::QName.new(nil, "msgid")] = value33 __xmlattr[AttrMsgid] = value 22 34 end 23 35 … … 29 41 30 42 # {urn:ref}_point 43 # xmlattr_unit - SOAP::SOAPString 31 44 class C__point < ::String 45 AttrUnit = XSD::QName.new(nil, "unit") 46 47 def __xmlattr 48 @__xmlattr ||= {} 49 end 50 32 51 def xmlattr_unit 33 (@__xmlattr ||= {})[XSD::QName.new(nil, "unit")]52 __xmlattr[AttrUnit] 34 53 end 35 54 36 55 def xmlattr_unit=(value) 37 (@__xmlattr ||= {})[XSD::QName.new(nil, "unit")] = value56 __xmlattr[AttrUnit] = value 38 57 end 39 58 … … 45 64 46 65 # {urn:ref}Document 66 # xmlattr_ID - SOAP::SOAPString 47 67 class Document < ::String 68 AttrID = XSD::QName.new(nil, "ID") 69 70 def __xmlattr 71 @__xmlattr ||= {} 72 end 73 48 74 def xmlattr_ID 49 (@__xmlattr ||= {})[XSD::QName.new(nil, "ID")]75 __xmlattr[AttrID] 50 76 end 51 77 52 78 def xmlattr_ID=(value) 53 (@__xmlattr ||= {})[XSD::QName.new(nil, "ID")] = value79 __xmlattr[AttrID] = value 54 80 end 55 81 … … 61 87 62 88 # {urn:ref}DerivedChoice_BaseSimpleContent 89 # varStringExt - SOAP::SOAPString 90 # varFloatExt - SOAP::SOAPFloat 91 # xmlattr_ID - SOAP::SOAPString 92 # xmlattr_attrStringExt - SOAP::SOAPString 63 93 class DerivedChoice_BaseSimpleContent < Document 94 AttrAttrStringExt = XSD::QName.new(nil, "attrStringExt") 95 AttrID = XSD::QName.new(nil, "ID") 96 64 97 attr_accessor :varStringExt 65 98 attr_accessor :varFloatExt 66 99 100 def __xmlattr 101 @__xmlattr ||= {} 102 end 103 67 104 def xmlattr_ID 68 (@__xmlattr ||= {})[XSD::QName.new(nil, "ID")]105 __xmlattr[AttrID] 69 106 end 70 107 71 108 def xmlattr_ID=(value) 72 (@__xmlattr ||= {})[XSD::QName.new(nil, "ID")] = value109 __xmlattr[AttrID] = value 73 110 end 74 111 75 112 def xmlattr_attrStringExt 76 (@__xmlattr ||= {})[XSD::QName.new(nil, "attrStringExt")]113 __xmlattr[AttrAttrStringExt] 77 114 end 78 115 79 116 def xmlattr_attrStringExt=(value) 80 (@__xmlattr ||= {})[XSD::QName.new(nil, "attrStringExt")] = value117 __xmlattr[AttrAttrStringExt] = value 81 118 end 82 119 … … 96 133 97 134 # {urn:ref}Product-Bag 135 # bag - WSDL::Ref::Product 136 # rating - SOAP::SOAPString 137 # comment_1 - (any) 138 # comment_2 - WSDL::Ref::Comment 139 # m___point - WSDL::Ref::C__point 140 # xmlattr_version - SOAP::SOAPString 141 # xmlattr_yesno - SOAP::SOAPString 98 142 class ProductBag 143 AttrVersion = XSD::QName.new("urn:ref", "version") 144 AttrYesno = XSD::QName.new("urn:ref", "yesno") 145 99 146 attr_accessor :bag 100 147 attr_accessor :rating … … 110 157 end 111 158 159 def __xmlattr 160 @__xmlattr ||= {} 161 end 162 112 163 def xmlattr_version 113 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "version")]164 __xmlattr[AttrVersion] 114 165 end 115 166 116 167 def xmlattr_version=(value) 117 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "version")] = value168 __xmlattr[AttrVersion] = value 118 169 end 119 170 120 171 def xmlattr_yesno 121 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "yesno")]172 __xmlattr[AttrYesno] 122 173 end 123 174 124 175 def xmlattr_yesno=(value) 125 (@__xmlattr ||= {})[XSD::QName.new("urn:ref", "yesno")] = value176 __xmlattr[AttrYesno] = value 126 177 end 127 178 … … 137 188 138 189 # {urn:ref}Creator 190 # xmlattr_Role - SOAP::SOAPString 139 191 class Creator < ::String 192 AttrRole = XSD::QName.new(nil, "Role") 193 194 def __xmlattr 195 @__xmlattr ||= {} 196 end 197 140 198 def xmlattr_Role 141 (@__xmlattr ||= {})[XSD::QName.new(nil, "Role")]199 __xmlattr[AttrRole] 142 200 end 143 201 144 202 def xmlattr_Role=(value) 145 (@__xmlattr ||= {})[XSD::QName.new(nil, "Role")] = value203 __xmlattr[AttrRole] = value 146 204 end 147 205 … … 157 215 Y = Yesno.new("Y") 158 216 end 217 218 219 end trunk/test/wsdl/ref/test_ref.rb
r1794 r1891 112 112 gen.basedir = DIR 113 113 gen.logger.level = Logger::FATAL 114 gen.opt['module_path'] = self.class.to_s.sub(/::[^:]+$/, '') 114 115 gen.opt['classdef'] = nil 115 116 gen.opt['force'] = true trunk/test/wsdl/simpletype/rpc/expectedEchoVersion.rb
r1773 r1891 2 2 3 3 # {urn:example.com:simpletype-rpc-type}version_struct 4 # version - Version 5 # msg - SOAP::SOAPString 4 6 class Version_struct 5 7 attr_accessor :version trunk/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb
r1880 r1891 5 5 EncodedRegistry = ::SOAP::Mapping::EncodedRegistry.new 6 6 LiteralRegistry = ::SOAP::Mapping::LiteralRegistry.new 7 NsSimpletypeRpcType = "urn:example.com:simpletype-rpc-type" 7 8 8 9 EncodedRegistry.register( … … 18 19 EncodedRegistry.register( 19 20 :class => Version, 20 :schema_ns => "urn:example.com:simpletype-rpc-type",21 :schema_ns => NsSimpletypeRpcType, 21 22 :schema_type => "version" 22 23 ) … … 24 25 EncodedRegistry.register( 25 26 :class => StateType, 26 :schema_ns => "urn:example.com:simpletype-rpc-type",27 :schema_ns => NsSimpletypeRpcType, 27 28 :schema_type => "stateType" 28 29 ) … … 30 31 EncodedRegistry.register( 31 32 :class => ZipIntType, 32 :schema_ns => "urn:example.com:simpletype-rpc-type",33 :schema_ns => NsSimpletypeRpcType, 33 34 :schema_type => "zipIntType" 34 35 ) … … 36 37 LiteralRegistry.register( 37 38 :class => Version_struct, 38 :schema_ns => "urn:example.com:simpletype-rpc-type",39 :schema_ns => NsSimpletypeRpcType, 39 40 :schema_type => "version_struct", 40 41 :schema_qualified => false, … … 47 48 LiteralRegistry.register( 48 49 :class => Version, 49 :schema_ns => "urn:example.com:simpletype-rpc-type",50 :schema_ns => NsSimpletypeRpcType, 50 51 :schema_type => "version" 51 52 ) … … 53 54 LiteralRegistry.register( 54 55 :class => StateType, 55 :schema_ns => "urn:example.com:simpletype-rpc-type",56 :schema_ns => NsSimpletypeRpcType, 56 57 :schema_type => "stateType" 57 58 ) … … 59 60 LiteralRegistry.register( 60 61 :class => ZipIntType, 61 :schema_ns => "urn:example.com:simpletype-rpc-type",62 :schema_ns => NsSimpletypeRpcType, 62 63 :schema_type => "zipIntType" 63 64 ) trunk/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb
r1731 r1891 2 2 3 3 # {urn:example.com:simpletype-rpc-type}version_struct 4 # version - Version 5 # msg - SOAP::SOAPString 4 6 class Version_struct 5 7 attr_accessor :version trunk/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb
r1880 r1891 5 5 EncodedRegistry = ::SOAP::Mapping::EncodedRegistry.new 6 6 LiteralRegistry = ::SOAP::Mapping::LiteralRegistry.new 7 NsSimpletypeRpcType = "urn:example.com:simpletype-rpc-type" 7 8 8 9 EncodedRegistry.register( … … 18 19 EncodedRegistry.register( 19 20 :class => Version, 20 :schema_ns => "urn:example.com:simpletype-rpc-type",21 :schema_ns => NsSimpletypeRpcType, 21 22 :schema_type => "version" 22 23 ) … … 24 25 LiteralRegistry.register( 25 26 :class => Version_struct, 26 :schema_ns => "urn:example.com:simpletype-rpc-type",27 :schema_ns => NsSimpletypeRpcType, 27 28 :schema_type => "version_struct", 28 29 :schema_qualified => false, … … 35 36 LiteralRegistry.register( 36 37 :class => Version, 37 :schema_ns => "urn:example.com:simpletype-rpc-type",38 :schema_ns => NsSimpletypeRpcType, 38 39 :schema_type => "version" 39 40 ) trunk/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb
r1731 r1891 2 2 3 3 # {urn:mysample}question 4 # something - SOAP::SOAPString 4 5 class Question 5 6 attr_accessor :something … … 11 12 12 13 # {urn:mysample}section 14 # sectionID - SOAP::SOAPInt 15 # name - SOAP::SOAPString 16 # description - SOAP::SOAPString 17 # index - SOAP::SOAPInt 18 # firstQuestion - Question 13 19 class Section 14 20 attr_accessor :sectionID trunk/test/xsd/xsd2ruby/expected_mysample.rb
r1857 r1891 5 5 6 6 # {urn:mysample}question 7 # something - SOAP::SOAPString 7 8 class Question 8 9 attr_accessor :something … … 14 15 15 16 # {urn:mysample}section 17 # sectionID - SOAP::SOAPInt 18 # name - SOAP::SOAPString 19 # description - SOAP::SOAPString 20 # index - SOAP::SOAPInt 21 # firstQuestion - XSD::XSD2Ruby::Question 16 22 class Section 17 23 attr_accessor :sectionID … … 35 41 36 42 # {urn:mysample}sectionElement 43 # sectionID - SOAP::SOAPInt 44 # name - SOAP::SOAPString 45 # description - SOAP::SOAPString 46 # index - SOAP::SOAPInt 47 # firstQuestion - XSD::XSD2Ruby::Question 37 48 class SectionElement 38 49 attr_accessor :sectionID