soap4r_es 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/wsdl2ruby.rb +140 -0
- data/bin/wsdl2ruby_rails.rb +140 -0
- data/bin/xsd2ruby.rb +92 -0
- data/lib/soap/attachment.rb +109 -0
- data/lib/soap/attrproxy.rb +35 -0
- data/lib/soap/baseData.rb +1095 -0
- data/lib/soap/element.rb +278 -0
- data/lib/soap/encodingstyle/aspDotNetHandler.rb +208 -0
- data/lib/soap/encodingstyle/handler.rb +121 -0
- data/lib/soap/encodingstyle/literalHandler.rb +196 -0
- data/lib/soap/encodingstyle/soapHandler.rb +560 -0
- data/lib/soap/filter/filterchain.rb +52 -0
- data/lib/soap/filter/handler.rb +32 -0
- data/lib/soap/filter/streamhandler.rb +30 -0
- data/lib/soap/filter.rb +14 -0
- data/lib/soap/generator.rb +299 -0
- data/lib/soap/header/handler.rb +64 -0
- data/lib/soap/header/handlerset.rb +78 -0
- data/lib/soap/header/mappinghandler.rb +48 -0
- data/lib/soap/header/simplehandler.rb +45 -0
- data/lib/soap/httpconfigloader.rb +140 -0
- data/lib/soap/mapping/encodedregistry.rb +541 -0
- data/lib/soap/mapping/factory.rb +389 -0
- data/lib/soap/mapping/literalregistry.rb +392 -0
- data/lib/soap/mapping/mapping.rb +577 -0
- data/lib/soap/mapping/registry.rb +297 -0
- data/lib/soap/mapping/rubytypeFactory.rb +446 -0
- data/lib/soap/mapping/schemadefinition.rb +171 -0
- data/lib/soap/mapping/typeMap.rb +107 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +212 -0
- data/lib/soap/mapping/wsdlliteralregistry.rb +249 -0
- data/lib/soap/mapping.rb +13 -0
- data/lib/soap/marshal.rb +60 -0
- data/lib/soap/mimemessage.rb +243 -0
- data/lib/soap/nestedexception.rb +43 -0
- data/lib/soap/netHttpClient.rb +242 -0
- data/lib/soap/ns.rb +39 -0
- data/lib/soap/parser.rb +253 -0
- data/lib/soap/processor.rb +67 -0
- data/lib/soap/property.rb +330 -0
- data/lib/soap/proxy.rb +15 -0
- data/lib/soap/rpc/cgistub.rb +249 -0
- data/lib/soap/rpc/driver.rb +222 -0
- data/lib/soap/rpc/element.rb +375 -0
- data/lib/soap/rpc/httpserver.rb +144 -0
- data/lib/soap/rpc/methodDef.rb +69 -0
- data/lib/soap/rpc/proxy.rb +573 -0
- data/lib/soap/rpc/router.rb +672 -0
- data/lib/soap/rpc/rpc.rb +26 -0
- data/lib/soap/rpc/soaplet.rb +201 -0
- data/lib/soap/rpc/standaloneServer.rb +44 -0
- data/lib/soap/soap.rb +163 -0
- data/lib/soap/streamHandler.rb +302 -0
- data/lib/soap/version.rb +12 -0
- data/lib/soap/wsdlDriver.rb +165 -0
- data/lib/wsdl/binding.rb +66 -0
- data/lib/wsdl/data.rb +65 -0
- data/lib/wsdl/definitions.rb +237 -0
- data/lib/wsdl/documentation.rb +33 -0
- data/lib/wsdl/import.rb +81 -0
- data/lib/wsdl/importer.rb +39 -0
- data/lib/wsdl/info.rb +51 -0
- data/lib/wsdl/message.rb +55 -0
- data/lib/wsdl/operation.rb +152 -0
- data/lib/wsdl/operationBinding.rb +241 -0
- data/lib/wsdl/param.rb +94 -0
- data/lib/wsdl/parser.rb +180 -0
- data/lib/wsdl/part.rb +53 -0
- data/lib/wsdl/port.rb +67 -0
- data/lib/wsdl/portType.rb +76 -0
- data/lib/wsdl/service.rb +62 -0
- data/lib/wsdl/soap/address.rb +41 -0
- data/lib/wsdl/soap/binding.rb +50 -0
- data/lib/wsdl/soap/body.rb +59 -0
- data/lib/wsdl/soap/cgiStubCreator.rb +93 -0
- data/lib/wsdl/soap/classDefCreator.rb +529 -0
- data/lib/wsdl/soap/classDefCreatorSupport.rb +242 -0
- data/lib/wsdl/soap/classNameCreator.rb +57 -0
- data/lib/wsdl/soap/clientSkeltonCreator.rb +107 -0
- data/lib/wsdl/soap/complexType.rb +174 -0
- data/lib/wsdl/soap/data.rb +43 -0
- data/lib/wsdl/soap/definitions.rb +201 -0
- data/lib/wsdl/soap/driverCreator.rb +121 -0
- data/lib/wsdl/soap/element.rb +34 -0
- data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +74 -0
- data/lib/wsdl/soap/fault.rb +57 -0
- data/lib/wsdl/soap/header.rb +87 -0
- data/lib/wsdl/soap/headerfault.rb +57 -0
- data/lib/wsdl/soap/literalMappingRegistryCreator.rb +116 -0
- data/lib/wsdl/soap/mappingRegistryCreator.rb +59 -0
- data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +380 -0
- data/lib/wsdl/soap/methodDefCreator.rb +200 -0
- data/lib/wsdl/soap/operation.rb +113 -0
- data/lib/wsdl/soap/servantSkeltonCreator.rb +92 -0
- data/lib/wsdl/soap/servletStubCreator.rb +105 -0
- data/lib/wsdl/soap/standaloneServerStubCreator.rb +101 -0
- data/lib/wsdl/soap/wsdl2ruby.rb +249 -0
- data/lib/wsdl/types.rb +45 -0
- data/lib/wsdl/wsdl.rb +25 -0
- data/lib/wsdl/xmlSchema/all.rb +25 -0
- data/lib/wsdl/xmlSchema/annotation.rb +35 -0
- data/lib/wsdl/xmlSchema/any.rb +62 -0
- data/lib/wsdl/xmlSchema/anyAttribute.rb +49 -0
- data/lib/wsdl/xmlSchema/attribute.rb +105 -0
- data/lib/wsdl/xmlSchema/attributeGroup.rb +69 -0
- data/lib/wsdl/xmlSchema/choice.rb +59 -0
- data/lib/wsdl/xmlSchema/complexContent.rb +98 -0
- data/lib/wsdl/xmlSchema/complexExtension.rb +120 -0
- data/lib/wsdl/xmlSchema/complexRestriction.rb +105 -0
- data/lib/wsdl/xmlSchema/complexType.rb +194 -0
- data/lib/wsdl/xmlSchema/content.rb +96 -0
- data/lib/wsdl/xmlSchema/data.rb +117 -0
- data/lib/wsdl/xmlSchema/element.rb +154 -0
- data/lib/wsdl/xmlSchema/enumeration.rb +37 -0
- data/lib/wsdl/xmlSchema/fractiondigits.rb +38 -0
- data/lib/wsdl/xmlSchema/group.rb +101 -0
- data/lib/wsdl/xmlSchema/import.rb +53 -0
- data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
- data/lib/wsdl/xmlSchema/importer.rb +103 -0
- data/lib/wsdl/xmlSchema/include.rb +48 -0
- data/lib/wsdl/xmlSchema/length.rb +38 -0
- data/lib/wsdl/xmlSchema/list.rb +49 -0
- data/lib/wsdl/xmlSchema/maxexclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/maxinclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/maxlength.rb +38 -0
- data/lib/wsdl/xmlSchema/minexclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/mininclusive.rb +38 -0
- data/lib/wsdl/xmlSchema/minlength.rb +38 -0
- data/lib/wsdl/xmlSchema/parser.rb +168 -0
- data/lib/wsdl/xmlSchema/pattern.rb +37 -0
- data/lib/wsdl/xmlSchema/ref.rb +34 -0
- data/lib/wsdl/xmlSchema/schema.rb +179 -0
- data/lib/wsdl/xmlSchema/sequence.rb +55 -0
- data/lib/wsdl/xmlSchema/simpleContent.rb +70 -0
- data/lib/wsdl/xmlSchema/simpleExtension.rb +63 -0
- data/lib/wsdl/xmlSchema/simpleRestriction.rb +133 -0
- data/lib/wsdl/xmlSchema/simpleType.rb +88 -0
- data/lib/wsdl/xmlSchema/totaldigits.rb +38 -0
- data/lib/wsdl/xmlSchema/union.rb +36 -0
- data/lib/wsdl/xmlSchema/unique.rb +35 -0
- data/lib/wsdl/xmlSchema/whitespace.rb +38 -0
- data/lib/wsdl/xmlSchema/xsd2ruby.rb +177 -0
- data/lib/xsd/charset.rb +190 -0
- data/lib/xsd/codegen/classdef.rb +230 -0
- data/lib/xsd/codegen/commentdef.rb +35 -0
- data/lib/xsd/codegen/gensupport.rb +277 -0
- data/lib/xsd/codegen/methoddef.rb +71 -0
- data/lib/xsd/codegen/moduledef.rb +209 -0
- data/lib/xsd/codegen.rb +13 -0
- data/lib/xsd/datatypes.rb +1465 -0
- data/lib/xsd/datatypes1999.rb +21 -0
- data/lib/xsd/iconvcharset.rb +33 -0
- data/lib/xsd/mapping.rb +69 -0
- data/lib/xsd/namedelements.rb +133 -0
- data/lib/xsd/ns.rb +183 -0
- data/lib/xsd/qname.rb +80 -0
- data/lib/xsd/xmlparser/libxmlparser.rb +136 -0
- data/lib/xsd/xmlparser/nokogiriparser.rb +63 -0
- data/lib/xsd/xmlparser/ogaparser.rb +53 -0
- data/lib/xsd/xmlparser/oxparser.rb +97 -0
- data/lib/xsd/xmlparser/parser.rb +101 -0
- data/lib/xsd/xmlparser/rexmlparser.rb +54 -0
- data/lib/xsd/xmlparser.rb +81 -0
- metadata +240 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - XML Schema Datatype 1999 support
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require 'xsd/datatypes'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module XSD
|
|
14
|
+
Namespace.replace('http://www.w3.org/1999/XMLSchema')
|
|
15
|
+
InstanceNamespace.replace('http://www.w3.org/1999/XMLSchema-instance')
|
|
16
|
+
AnyTypeLiteral.replace('ur-type')
|
|
17
|
+
AnySimpleTypeLiteral.replace('ur-type')
|
|
18
|
+
NilLiteral.replace('null')
|
|
19
|
+
NilValue.replace('1')
|
|
20
|
+
DateTimeLiteral.replace('timeInstant')
|
|
21
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - Charset handling with iconv.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
require 'iconv' unless ''.respond_to? :encode
|
|
10
|
+
|
|
11
|
+
module XSD
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IconvCharset
|
|
15
|
+
def self.safe_iconv(to, from, str)
|
|
16
|
+
return str.encode(to, from, :invalid => :replace, :undef => :replace, :replace => '?') if ''.respond_to? :encode
|
|
17
|
+
iconv = Iconv.new(to, from)
|
|
18
|
+
out = ""
|
|
19
|
+
begin
|
|
20
|
+
out << iconv.iconv(str)
|
|
21
|
+
rescue Iconv::IllegalSequence => e
|
|
22
|
+
out << e.success
|
|
23
|
+
ch, str = e.failed.split(//, 2)
|
|
24
|
+
out << '?'
|
|
25
|
+
warn("Failed to convert #{ch}")
|
|
26
|
+
retry
|
|
27
|
+
end
|
|
28
|
+
return out
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
end
|
data/lib/xsd/mapping.rb
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - XML Mapping for Ruby
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require "soap/parser"
|
|
11
|
+
require 'soap/encodingstyle/literalHandler'
|
|
12
|
+
require "soap/generator"
|
|
13
|
+
require "soap/mapping"
|
|
14
|
+
require "soap/mapping/wsdlliteralregistry"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
module XSD
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
module Mapping
|
|
21
|
+
MappingRegistry = SOAP::Mapping::LiteralRegistry.new
|
|
22
|
+
|
|
23
|
+
def self.obj2xml(obj, elename = nil, io = nil)
|
|
24
|
+
Mapper.new(MappingRegistry).obj2xml(obj, elename, io)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.xml2obj(stream, klass = nil)
|
|
28
|
+
Mapper.new(MappingRegistry).xml2obj(stream, klass)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Mapper
|
|
32
|
+
MAPPING_OPT = {
|
|
33
|
+
:default_encodingstyle => SOAP::LiteralNamespace,
|
|
34
|
+
:generate_explicit_type => false,
|
|
35
|
+
:root_type_hint => true
|
|
36
|
+
}.freeze
|
|
37
|
+
|
|
38
|
+
def initialize(registry)
|
|
39
|
+
@registry = registry
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def obj2xml(obj, elename = nil, io = nil)
|
|
43
|
+
opt = MAPPING_OPT.dup
|
|
44
|
+
unless elename
|
|
45
|
+
if definition = @registry.elename_schema_definition_from_class(obj.class)
|
|
46
|
+
elename = definition.elename
|
|
47
|
+
opt[:root_type_hint] = false
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
elename = SOAP::Mapping.to_qname(elename) if elename
|
|
51
|
+
soap = SOAP::Mapping.obj2soap(obj, @registry, elename, opt)
|
|
52
|
+
if soap.elename.nil? or soap.elename == XSD::QName::EMPTY
|
|
53
|
+
soap.elename =
|
|
54
|
+
XSD::QName.new(nil, SOAP::Mapping.name2elename(obj.class.to_s))
|
|
55
|
+
end
|
|
56
|
+
generator = SOAP::Generator.new(opt)
|
|
57
|
+
generator.generate(soap, io)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def xml2obj(stream, klass = nil)
|
|
61
|
+
parser = SOAP::Parser.new(MAPPING_OPT)
|
|
62
|
+
soap = parser.parse(stream)
|
|
63
|
+
SOAP::Mapping.soap2obj(soap, @registry, klass)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - WSDL named element collection.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module XSD
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class NamedElements
|
|
14
|
+
include Enumerable
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
@elements = []
|
|
18
|
+
@cache = {}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def dup
|
|
22
|
+
o = NamedElements.new
|
|
23
|
+
o.elements = @elements.dup
|
|
24
|
+
o
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def freeze
|
|
28
|
+
super
|
|
29
|
+
@elements.freeze
|
|
30
|
+
self
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def empty?
|
|
34
|
+
size == 0
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def size
|
|
38
|
+
@elements.size
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def [](idx)
|
|
42
|
+
if idx.is_a?(Numeric)
|
|
43
|
+
@elements[idx]
|
|
44
|
+
else
|
|
45
|
+
@cache[idx] ||= @elements.find { |item| item.name == idx }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def find_name(name)
|
|
50
|
+
@elements.find { |item| item.name.name == name }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def keys
|
|
54
|
+
collect { |element| element.name }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def each
|
|
58
|
+
@elements.each do |element|
|
|
59
|
+
yield(element)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def <<(rhs)
|
|
64
|
+
@elements << rhs
|
|
65
|
+
self
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def delete(rhs)
|
|
69
|
+
rv = @elements.delete(rhs)
|
|
70
|
+
@cache.clear
|
|
71
|
+
rv
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def +(rhs)
|
|
75
|
+
o = NamedElements.new
|
|
76
|
+
o.elements = @elements + rhs.elements
|
|
77
|
+
@cache.clear
|
|
78
|
+
o
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def concat(rhs)
|
|
82
|
+
@elements.concat(rhs.elements)
|
|
83
|
+
@cache.clear
|
|
84
|
+
self
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def uniq
|
|
88
|
+
o = NamedElements.new
|
|
89
|
+
o.elements = uniq_elements
|
|
90
|
+
o
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def uniq!
|
|
94
|
+
@elements.replace(uniq_elements)
|
|
95
|
+
@cache.clear
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def find_all
|
|
99
|
+
o = NamedElements.new
|
|
100
|
+
each do |ele|
|
|
101
|
+
o << ele if yield(ele)
|
|
102
|
+
end
|
|
103
|
+
o
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
Empty = NamedElements.new.freeze
|
|
107
|
+
|
|
108
|
+
protected
|
|
109
|
+
|
|
110
|
+
def elements=(rhs)
|
|
111
|
+
@elements = rhs
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def elements
|
|
115
|
+
@elements
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
private
|
|
119
|
+
|
|
120
|
+
def uniq_elements
|
|
121
|
+
dict = {}
|
|
122
|
+
elements = []
|
|
123
|
+
@elements.each do |ele|
|
|
124
|
+
unless dict.key?(ele.name)
|
|
125
|
+
dict[ele.name] = ele
|
|
126
|
+
elements << ele
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
elements
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
data/lib/xsd/ns.rb
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - XML Schema Namespace library
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require 'xsd/datatypes'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module XSD
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NS
|
|
17
|
+
Namespace = 'http://www.w3.org/XML/1998/namespace'
|
|
18
|
+
|
|
19
|
+
KNOWN_TAG = {
|
|
20
|
+
XSD::Namespace => 'xsd',
|
|
21
|
+
XSD::InstanceNamespace => 'xsi',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
class Assigner
|
|
25
|
+
attr_reader :known_tag
|
|
26
|
+
|
|
27
|
+
def initialize(known_tag)
|
|
28
|
+
@known_tag = known_tag.dup
|
|
29
|
+
@count = 0
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def assign(ns)
|
|
33
|
+
if @known_tag.key?(ns)
|
|
34
|
+
return @known_tag[ns]
|
|
35
|
+
end
|
|
36
|
+
@count += 1
|
|
37
|
+
"n#{@count}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
attr_reader :default_namespace
|
|
42
|
+
|
|
43
|
+
class FormatError < Error; end
|
|
44
|
+
|
|
45
|
+
public
|
|
46
|
+
|
|
47
|
+
def initialize(tag2ns = nil)
|
|
48
|
+
@tag2ns = tag2ns || ns_default
|
|
49
|
+
@ns2tag = @tag2ns.invert
|
|
50
|
+
@assigner = nil
|
|
51
|
+
@default_namespace = nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def known_tag
|
|
55
|
+
@assigner ||= Assigner.new(default_known_tag)
|
|
56
|
+
@assigner.known_tag
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def assign(ns, tag = nil)
|
|
60
|
+
if tag == ''
|
|
61
|
+
if ns.empty?
|
|
62
|
+
@default_namespace = nil
|
|
63
|
+
else
|
|
64
|
+
@default_namespace = ns
|
|
65
|
+
end
|
|
66
|
+
tag
|
|
67
|
+
else
|
|
68
|
+
@assigner ||= Assigner.new(default_known_tag)
|
|
69
|
+
tag ||= @assigner.assign(ns)
|
|
70
|
+
@ns2tag[ns] = tag
|
|
71
|
+
@tag2ns[tag] = ns
|
|
72
|
+
tag
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def assigned?(ns)
|
|
77
|
+
@default_namespace == ns or @ns2tag.key?(ns)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def assigned_as_tagged?(ns)
|
|
81
|
+
@ns2tag.key?(ns)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def assigned_tag?(tag)
|
|
85
|
+
@tag2ns.key?(tag)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def clone_ns
|
|
89
|
+
cloned = self.class.new(@tag2ns.dup)
|
|
90
|
+
cloned.assigner = @assigner
|
|
91
|
+
cloned.assign(@default_namespace, '') if @default_namespace
|
|
92
|
+
cloned
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def name(qname)
|
|
96
|
+
if qname.namespace == @default_namespace
|
|
97
|
+
qname.name
|
|
98
|
+
elsif tag = @ns2tag[qname.namespace]
|
|
99
|
+
"#{tag}:#{qname.name}"
|
|
100
|
+
else
|
|
101
|
+
raise FormatError.new("namespace: #{qname.namespace} not defined yet")
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# no default namespace
|
|
106
|
+
def name_attr(qname)
|
|
107
|
+
if tag = @ns2tag[qname.namespace]
|
|
108
|
+
"#{tag}:#{qname.name}"
|
|
109
|
+
else
|
|
110
|
+
raise FormatError.new("namespace: #{qname.namespace} not defined yet")
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def compare(ns, name, rhs)
|
|
115
|
+
if (ns == @default_namespace)
|
|
116
|
+
return true if (name == rhs)
|
|
117
|
+
end
|
|
118
|
+
@tag2ns.each do |assigned_tag, assigned_ns|
|
|
119
|
+
if assigned_ns == ns && "#{assigned_tag}:#{name}" == rhs
|
|
120
|
+
return true
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
false
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# $1 and $2 are necessary.
|
|
127
|
+
ParseRegexp = Regexp.new('\A([^:]+)(?::(.+))?\z', nil)
|
|
128
|
+
|
|
129
|
+
def parse(str, local = false)
|
|
130
|
+
if ParseRegexp =~ str
|
|
131
|
+
if (name = $2) and (ns = @tag2ns[$1])
|
|
132
|
+
return XSD::QName.new(ns, name)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
XSD::QName.new(local ? nil : @default_namespace, str)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# For local attribute key parsing
|
|
139
|
+
# <foo xmlns="urn:a" xmlns:n1="urn:a" bar="1" n1:baz="2" />
|
|
140
|
+
# =>
|
|
141
|
+
# {}bar, {urn:a}baz
|
|
142
|
+
def parse_local(elem)
|
|
143
|
+
ParseRegexp =~ elem
|
|
144
|
+
if $2
|
|
145
|
+
ns = @tag2ns[$1]
|
|
146
|
+
name = $2
|
|
147
|
+
if !ns
|
|
148
|
+
raise FormatError.new("unknown namespace qualifier: #{$1}")
|
|
149
|
+
end
|
|
150
|
+
elsif $1
|
|
151
|
+
ns = nil
|
|
152
|
+
name = $1
|
|
153
|
+
else
|
|
154
|
+
raise FormatError.new("illegal element format: #{elem}")
|
|
155
|
+
end
|
|
156
|
+
XSD::QName.new(ns, name)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def each_ns
|
|
160
|
+
@ns2tag.each do |ns, tag|
|
|
161
|
+
yield(ns, tag)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
protected
|
|
166
|
+
|
|
167
|
+
def assigner=(assigner)
|
|
168
|
+
@assigner = assigner
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
private
|
|
172
|
+
|
|
173
|
+
def ns_default
|
|
174
|
+
{'xml' => Namespace}
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def default_known_tag
|
|
178
|
+
KNOWN_TAG
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
end
|
data/lib/xsd/qname.rb
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - XML QName definition.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module XSD
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class QName
|
|
14
|
+
attr_reader :namespace
|
|
15
|
+
attr_reader :name
|
|
16
|
+
attr_accessor :source
|
|
17
|
+
|
|
18
|
+
def initialize(namespace = nil, name = nil)
|
|
19
|
+
@namespace = namespace ? namespace.to_s : nil
|
|
20
|
+
@name = name ? name.to_s : nil
|
|
21
|
+
@source = nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def dup_name(name)
|
|
25
|
+
XSD::QName.new(@namespace, name)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def dump(predefined_ns = nil)
|
|
29
|
+
ns = predefined_ns
|
|
30
|
+
ns ||= @namespace.nil? ? 'nil' : @namespace.dump
|
|
31
|
+
name = @name.nil? ? 'nil' : @name.dump
|
|
32
|
+
"XSD::QName.new(#{ns}, #{name})"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def match(rhs)
|
|
36
|
+
if rhs.namespace and (rhs.namespace != @namespace)
|
|
37
|
+
return false
|
|
38
|
+
end
|
|
39
|
+
if rhs.name and (rhs.name != @name)
|
|
40
|
+
return false
|
|
41
|
+
end
|
|
42
|
+
true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def ==(rhs)
|
|
46
|
+
!rhs.nil? and @namespace == rhs.namespace and @name == rhs.name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def ===(rhs)
|
|
50
|
+
(self == rhs)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def eql?(rhs)
|
|
54
|
+
(self == rhs)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def hash
|
|
58
|
+
@namespace.hash ^ @name.hash
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def to_s
|
|
62
|
+
"{#{ namespace }}#{ name }"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def inspect
|
|
66
|
+
sprintf("#<%s:0x%x %s>", self.class.name, __id__,
|
|
67
|
+
"{#{ namespace }}#{ name }")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
NormalizedNameRegexp = /^\{([^}]*)\}(.*)$/
|
|
71
|
+
def parse(str)
|
|
72
|
+
NormalizedNameRegexp =~ str
|
|
73
|
+
self.new($1, $2)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
EMPTY = QName.new.freeze
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - XMLParser XML parser library.
|
|
3
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
### WIP, 2015-June-13:
|
|
10
|
+
###
|
|
11
|
+
### LibXML drops namespaces on Elements *AND* Attributes, which makes it impossible
|
|
12
|
+
### to correctly associate Namespaces on Namespace-Declared Element Attributes when
|
|
13
|
+
### more than one namespace exists.
|
|
14
|
+
###
|
|
15
|
+
### This issue is evident when you run test/soap/test_cookie.rb
|
|
16
|
+
###
|
|
17
|
+
|
|
18
|
+
require 'libxml'
|
|
19
|
+
|
|
20
|
+
module XSD
|
|
21
|
+
module XMLParser
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LibXMLParser < XSD::XMLParser::Parser
|
|
25
|
+
include ::LibXML::XML::SaxParser::Callbacks
|
|
26
|
+
|
|
27
|
+
def do_parse(string_or_readable)
|
|
28
|
+
$stderr.puts "XSD::XMLParser::LibXMLParser.do_parse" if $DEBUG
|
|
29
|
+
# string = string_or_readable.respond_to?(:read) ? string_or_readable.read : string_or_readable
|
|
30
|
+
|
|
31
|
+
@charset = 'utf-8'
|
|
32
|
+
string = StringIO.new(string_or_readable)
|
|
33
|
+
parser = LibXML::XML::SaxParser.io(string)
|
|
34
|
+
parser.callbacks = self
|
|
35
|
+
parser.parse
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ENTITY_REF_MAP = {
|
|
39
|
+
'lt' => '<',
|
|
40
|
+
'gt' => '>',
|
|
41
|
+
'amp' => '&',
|
|
42
|
+
'quot' => '"',
|
|
43
|
+
'apos' => '\''
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
#def on_internal_subset(name, external_id, system_id)
|
|
47
|
+
# nil
|
|
48
|
+
#end
|
|
49
|
+
|
|
50
|
+
#def on_is_standalone()
|
|
51
|
+
# nil
|
|
52
|
+
#end
|
|
53
|
+
|
|
54
|
+
#def on_has_internal_subset()
|
|
55
|
+
# nil
|
|
56
|
+
#end
|
|
57
|
+
|
|
58
|
+
#def on_has_external_subset()
|
|
59
|
+
# nil
|
|
60
|
+
#end
|
|
61
|
+
|
|
62
|
+
#def on_start_document()
|
|
63
|
+
# nil
|
|
64
|
+
#end
|
|
65
|
+
|
|
66
|
+
#def on_end_document()
|
|
67
|
+
# nil
|
|
68
|
+
#end
|
|
69
|
+
|
|
70
|
+
def on_start_element_ns (name, attr_hash, prefix, uri, namespaces)
|
|
71
|
+
prefixed_ns = attr_hash.merge(Hash[namespaces.map{|k,v| ["xmlns:#{k}",v]}])
|
|
72
|
+
if prefix.nil?
|
|
73
|
+
start_element(name, prefixed_ns)
|
|
74
|
+
else
|
|
75
|
+
start_element("#{prefix}:#{name}", prefixed_ns)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def on_end_element_ns (name, prefix, uri)
|
|
80
|
+
if prefix.nil?
|
|
81
|
+
end_element(name)
|
|
82
|
+
else
|
|
83
|
+
end_element("#{prefix}:#{name}")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def on_start_element (name, attr_hash)
|
|
88
|
+
# start_element(name, attr_hash)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def on_end_element(name)
|
|
92
|
+
# end_element(name)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def on_reference(name)
|
|
96
|
+
characters(ENTITY_REF_MAP[name])
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def on_characters(chars)
|
|
100
|
+
characters(chars)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#def on_processing_instruction(target, data)
|
|
104
|
+
# nil
|
|
105
|
+
#end
|
|
106
|
+
|
|
107
|
+
#def on_comment(msg)
|
|
108
|
+
# nil
|
|
109
|
+
#end
|
|
110
|
+
|
|
111
|
+
def on_parser_warning(msg)
|
|
112
|
+
warn(msg)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def on_parser_error(msg)
|
|
116
|
+
raise ParseError.new(msg)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def on_parser_fatal_error(msg)
|
|
120
|
+
raise ParseError.new(msg)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def on_cdata_block(cdata)
|
|
124
|
+
characters(cdata)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def on_external_subset(name, external_id, system_id)
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
add_factory(self)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# XSD4R - Nokogiri XML parser library.
|
|
3
|
+
# Copyright (C) 2015 Laurence A. Lee <rubyjedi@gmail.com>
|
|
4
|
+
|
|
5
|
+
# This program is copyrighted free software by Laurence A. Lee. You can
|
|
6
|
+
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
7
|
+
# either the dual license version in 2003, or any later version.
|
|
8
|
+
|
|
9
|
+
require 'nokogiri'
|
|
10
|
+
|
|
11
|
+
module XSD
|
|
12
|
+
module XMLParser
|
|
13
|
+
|
|
14
|
+
class NokogiriParser < XSD::XMLParser::Parser
|
|
15
|
+
def do_parse(string_or_readable)
|
|
16
|
+
$stderr.puts "XSD::XMLParser::NokogiriParser.do_parse" if $DEBUG
|
|
17
|
+
handler = NokoDocHandler.new(self)
|
|
18
|
+
parser = Nokogiri::XML::SAX::Parser.new(handler)
|
|
19
|
+
parser.parse(string_or_readable)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
add_factory(self)
|
|
23
|
+
|
|
24
|
+
public :start_element
|
|
25
|
+
public :end_element
|
|
26
|
+
public :characters
|
|
27
|
+
public :xmldecl_encoding=
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class NokoDocHandler < Nokogiri::XML::SAX::Document
|
|
32
|
+
def initialize(owner)
|
|
33
|
+
@owner = (owner)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def xmldecl(version, encoding, standalone)
|
|
37
|
+
@owner.xmldecl_encoding= encoding
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def start_element(name,attrs)
|
|
41
|
+
@owner.start_element(name,Hash[*attrs.flatten])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def end_element(name)
|
|
45
|
+
@owner.end_element(name)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def cdata_block(t)
|
|
49
|
+
@owner.characters(t)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def characters(t)
|
|
53
|
+
@owner.characters(t)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def comment(t)
|
|
57
|
+
@owner.characters(t)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|