soap2r 1.5.8
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.
- data/bin/wsdl2ruby.rb +137 -0
- data/bin/xsd2ruby.rb +90 -0
- data/lib/soap/attachment.rb +108 -0
- data/lib/soap/attrproxy.rb +34 -0
- data/lib/soap/baseData.rb +1094 -0
- data/lib/soap/element.rb +277 -0
- data/lib/soap/encodingstyle/aspDotNetHandler.rb +207 -0
- data/lib/soap/encodingstyle/handler.rb +120 -0
- data/lib/soap/encodingstyle/literalHandler.rb +195 -0
- data/lib/soap/encodingstyle/soapHandler.rb +559 -0
- data/lib/soap/filter.rb +13 -0
- data/lib/soap/filter/filterchain.rb +51 -0
- data/lib/soap/filter/handler.rb +31 -0
- data/lib/soap/filter/streamhandler.rb +29 -0
- data/lib/soap/generator.rb +299 -0
- data/lib/soap/header/handler.rb +61 -0
- data/lib/soap/header/handlerset.rb +70 -0
- data/lib/soap/header/mappinghandler.rb +47 -0
- data/lib/soap/header/simplehandler.rb +44 -0
- data/lib/soap/httpconfigloader.rb +141 -0
- data/lib/soap/mapping.rb +12 -0
- data/lib/soap/mapping/encodedregistry.rb +537 -0
- data/lib/soap/mapping/factory.rb +388 -0
- data/lib/soap/mapping/literalregistry.rb +391 -0
- data/lib/soap/mapping/mapping.rb +576 -0
- data/lib/soap/mapping/registry.rb +295 -0
- data/lib/soap/mapping/rubytypeFactory.rb +446 -0
- data/lib/soap/mapping/schemadefinition.rb +170 -0
- data/lib/soap/mapping/typeMap.rb +106 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +211 -0
- data/lib/soap/mapping/wsdlliteralregistry.rb +248 -0
- data/lib/soap/marshal.rb +59 -0
- data/lib/soap/mimemessage.rb +241 -0
- data/lib/soap/nestedexception.rb +42 -0
- data/lib/soap/netHttpClient.rb +241 -0
- data/lib/soap/ns.rb +34 -0
- data/lib/soap/parser.rb +252 -0
- data/lib/soap/processor.rb +66 -0
- data/lib/soap/property.rb +319 -0
- data/lib/soap/proxy.rb +14 -0
- data/lib/soap/rpc/cgistub.rb +247 -0
- data/lib/soap/rpc/driver.rb +221 -0
- data/lib/soap/rpc/element.rb +374 -0
- data/lib/soap/rpc/httpserver.rb +142 -0
- data/lib/soap/rpc/methodDef.rb +68 -0
- data/lib/soap/rpc/proxy.rb +572 -0
- data/lib/soap/rpc/router.rb +662 -0
- data/lib/soap/rpc/rpc.rb +25 -0
- data/lib/soap/rpc/soaplet.rb +200 -0
- data/lib/soap/rpc/standaloneServer.rb +43 -0
- data/lib/soap/soap.rb +151 -0
- data/lib/soap/streamHandler.rb +301 -0
- data/lib/soap/wsdlDriver.rb +164 -0
- data/lib/wsdl/binding.rb +65 -0
- data/lib/wsdl/data.rb +64 -0
- data/lib/wsdl/definitions.rb +236 -0
- data/lib/wsdl/documentation.rb +32 -0
- data/lib/wsdl/import.rb +80 -0
- data/lib/wsdl/importer.rb +38 -0
- data/lib/wsdl/info.rb +50 -0
- data/lib/wsdl/message.rb +54 -0
- data/lib/wsdl/operation.rb +151 -0
- data/lib/wsdl/operationBinding.rb +240 -0
- data/lib/wsdl/param.rb +93 -0
- data/lib/wsdl/parser.rb +164 -0
- data/lib/wsdl/part.rb +52 -0
- data/lib/wsdl/port.rb +66 -0
- data/lib/wsdl/portType.rb +75 -0
- data/lib/wsdl/service.rb +61 -0
- data/lib/wsdl/soap/address.rb +40 -0
- data/lib/wsdl/soap/binding.rb +49 -0
- data/lib/wsdl/soap/body.rb +58 -0
- data/lib/wsdl/soap/cgiStubCreator.rb +92 -0
- data/lib/wsdl/soap/classDefCreator.rb +433 -0
- data/lib/wsdl/soap/classDefCreatorSupport.rb +240 -0
- data/lib/wsdl/soap/classNameCreator.rb +54 -0
- data/lib/wsdl/soap/clientSkeltonCreator.rb +104 -0
- data/lib/wsdl/soap/complexType.rb +173 -0
- data/lib/wsdl/soap/data.rb +42 -0
- data/lib/wsdl/soap/definitions.rb +200 -0
- data/lib/wsdl/soap/driverCreator.rb +118 -0
- data/lib/wsdl/soap/element.rb +33 -0
- data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +73 -0
- data/lib/wsdl/soap/fault.rb +56 -0
- data/lib/wsdl/soap/header.rb +86 -0
- data/lib/wsdl/soap/headerfault.rb +56 -0
- data/lib/wsdl/soap/literalMappingRegistryCreator.rb +115 -0
- data/lib/wsdl/soap/mappingRegistryCreator.rb +58 -0
- data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +376 -0
- data/lib/wsdl/soap/methodDefCreator.rb +199 -0
- data/lib/wsdl/soap/operation.rb +112 -0
- data/lib/wsdl/soap/servantSkeltonCreator.rb +89 -0
- data/lib/wsdl/soap/servletStubCreator.rb +104 -0
- data/lib/wsdl/soap/standaloneServerStubCreator.rb +100 -0
- data/lib/wsdl/soap/wsdl2ruby.rb +217 -0
- data/lib/wsdl/types.rb +44 -0
- data/lib/wsdl/wsdl.rb +24 -0
- data/lib/wsdl/xmlSchema/all.rb +24 -0
- data/lib/wsdl/xmlSchema/annotation.rb +34 -0
- data/lib/wsdl/xmlSchema/any.rb +61 -0
- data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
- data/lib/wsdl/xmlSchema/attribute.rb +104 -0
- data/lib/wsdl/xmlSchema/attributeGroup.rb +68 -0
- data/lib/wsdl/xmlSchema/choice.rb +58 -0
- data/lib/wsdl/xmlSchema/complexContent.rb +97 -0
- data/lib/wsdl/xmlSchema/complexExtension.rb +119 -0
- data/lib/wsdl/xmlSchema/complexRestriction.rb +104 -0
- data/lib/wsdl/xmlSchema/complexType.rb +193 -0
- data/lib/wsdl/xmlSchema/content.rb +95 -0
- data/lib/wsdl/xmlSchema/data.rb +116 -0
- data/lib/wsdl/xmlSchema/element.rb +153 -0
- data/lib/wsdl/xmlSchema/enumeration.rb +36 -0
- data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
- data/lib/wsdl/xmlSchema/group.rb +100 -0
- data/lib/wsdl/xmlSchema/import.rb +53 -0
- data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
- data/lib/wsdl/xmlSchema/importer.rb +102 -0
- data/lib/wsdl/xmlSchema/include.rb +48 -0
- data/lib/wsdl/xmlSchema/length.rb +37 -0
- data/lib/wsdl/xmlSchema/list.rb +48 -0
- data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/maxlength.rb +37 -0
- data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
- data/lib/wsdl/xmlSchema/minlength.rb +37 -0
- data/lib/wsdl/xmlSchema/parser.rb +167 -0
- data/lib/wsdl/xmlSchema/pattern.rb +36 -0
- data/lib/wsdl/xmlSchema/ref.rb +33 -0
- data/lib/wsdl/xmlSchema/schema.rb +178 -0
- data/lib/wsdl/xmlSchema/sequence.rb +54 -0
- data/lib/wsdl/xmlSchema/simpleContent.rb +69 -0
- data/lib/wsdl/xmlSchema/simpleExtension.rb +62 -0
- data/lib/wsdl/xmlSchema/simpleRestriction.rb +132 -0
- data/lib/wsdl/xmlSchema/simpleType.rb +87 -0
- data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
- data/lib/wsdl/xmlSchema/union.rb +35 -0
- data/lib/wsdl/xmlSchema/unique.rb +34 -0
- data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
- data/lib/wsdl/xmlSchema/xsd2ruby.rb +174 -0
- data/lib/xsd/charset.rb +193 -0
- data/lib/xsd/codegen.rb +12 -0
- data/lib/xsd/codegen/classdef.rb +208 -0
- data/lib/xsd/codegen/commentdef.rb +34 -0
- data/lib/xsd/codegen/gensupport.rb +273 -0
- data/lib/xsd/codegen/methoddef.rb +70 -0
- data/lib/xsd/codegen/moduledef.rb +208 -0
- data/lib/xsd/datatypes.rb +1466 -0
- data/lib/xsd/datatypes1999.rb +20 -0
- data/lib/xsd/iconvcharset.rb +39 -0
- data/lib/xsd/mapping.rb +68 -0
- data/lib/xsd/namedelements.rb +132 -0
- data/lib/xsd/ns.rb +182 -0
- data/lib/xsd/qname.rb +79 -0
- data/lib/xsd/xmlparser.rb +76 -0
- data/lib/xsd/xmlparser/libxmlparser.rb +115 -0
- data/lib/xsd/xmlparser/parser.rb +100 -0
- data/lib/xsd/xmlparser/rexmlparser.rb +58 -0
- data/lib/xsd/xmlparser/xmlparser.rb +50 -0
- data/lib/xsd/xmlparser/xmlscanner.rb +149 -0
- metadata +224 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
# XSD4R - XML Instance parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/xmlparser/parser'
|
10
|
+
|
11
|
+
|
12
|
+
module XSD
|
13
|
+
|
14
|
+
|
15
|
+
module XMLParser
|
16
|
+
def create_parser(host, opt)
|
17
|
+
XSD::XMLParser::Parser.create_parser(host, opt)
|
18
|
+
end
|
19
|
+
module_function :create_parser
|
20
|
+
|
21
|
+
# $1 is necessary.
|
22
|
+
NSParseRegexp = Regexp.new('^xmlns:?(.*)$', nil, 'NONE')
|
23
|
+
|
24
|
+
def filter_ns(ns, attrs)
|
25
|
+
ns_updated = false
|
26
|
+
if attrs.nil? or attrs.empty?
|
27
|
+
return [ns, attrs]
|
28
|
+
end
|
29
|
+
newattrs = {}
|
30
|
+
attrs.each do |key, value|
|
31
|
+
if NSParseRegexp =~ key
|
32
|
+
unless ns_updated
|
33
|
+
ns = ns.clone_ns
|
34
|
+
ns_updated = true
|
35
|
+
end
|
36
|
+
# tag == '' means 'default namespace'
|
37
|
+
# value == '' means 'no default namespace'
|
38
|
+
tag = $1 || ''
|
39
|
+
ns.assign(value, tag)
|
40
|
+
else
|
41
|
+
newattrs[key] = value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
return [ns, newattrs]
|
45
|
+
end
|
46
|
+
module_function :filter_ns
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
# Try to load XML processor.
|
54
|
+
loaded = false
|
55
|
+
[
|
56
|
+
'xsd/xmlparser/libxmlparser',
|
57
|
+
'xsd/xmlparser/xmlparser',
|
58
|
+
'xsd/xmlparser/xmlscanner',
|
59
|
+
'xsd/xmlparser/rexmlparser',
|
60
|
+
].each do |lib|
|
61
|
+
begin
|
62
|
+
require lib
|
63
|
+
# XXX: for a workaround of rubygems' require inconsistency
|
64
|
+
# XXX: MUST BE REMOVED IN THE FUTURE
|
65
|
+
name = lib.sub(/^.*\//, '')
|
66
|
+
raise LoadError unless XSD::XMLParser.constants.find { |c|
|
67
|
+
c.to_s.downcase == name
|
68
|
+
}
|
69
|
+
loaded = true
|
70
|
+
break
|
71
|
+
rescue LoadError
|
72
|
+
end
|
73
|
+
end
|
74
|
+
unless loaded
|
75
|
+
raise RuntimeError.new("XML processor module not found.")
|
76
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# XSD4R - XMLParser XML parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/xmlparser'
|
10
|
+
require 'xml/libxml'
|
11
|
+
|
12
|
+
|
13
|
+
module XSD
|
14
|
+
module XMLParser
|
15
|
+
|
16
|
+
|
17
|
+
class LibXMLParser < XSD::XMLParser::Parser
|
18
|
+
include XML::SaxParser::Callbacks
|
19
|
+
|
20
|
+
def do_parse(string_or_readable)
|
21
|
+
if string_or_readable.respond_to?(:read)
|
22
|
+
string = string_or_readable.read
|
23
|
+
else
|
24
|
+
string = string_or_readable
|
25
|
+
end
|
26
|
+
# XMLParser passes a String in utf-8.
|
27
|
+
@charset = 'utf-8'
|
28
|
+
@parser = XML::SaxParser.new
|
29
|
+
@parser.callbacks = self
|
30
|
+
@parser.string = string
|
31
|
+
@parser.parse
|
32
|
+
end
|
33
|
+
|
34
|
+
ENTITY_REF_MAP = {
|
35
|
+
'lt' => '<',
|
36
|
+
'gt' => '>',
|
37
|
+
'amp' => '&',
|
38
|
+
'quot' => '"',
|
39
|
+
'apos' => '\''
|
40
|
+
}
|
41
|
+
|
42
|
+
#def on_internal_subset(name, external_id, system_id)
|
43
|
+
# nil
|
44
|
+
#end
|
45
|
+
|
46
|
+
#def on_is_standalone()
|
47
|
+
# nil
|
48
|
+
#end
|
49
|
+
|
50
|
+
#def on_has_internal_subset()
|
51
|
+
# nil
|
52
|
+
#end
|
53
|
+
|
54
|
+
#def on_has_external_subset()
|
55
|
+
# nil
|
56
|
+
#end
|
57
|
+
|
58
|
+
#def on_start_document()
|
59
|
+
# nil
|
60
|
+
#end
|
61
|
+
|
62
|
+
#def on_end_document()
|
63
|
+
# nil
|
64
|
+
#end
|
65
|
+
|
66
|
+
def on_start_element(name, attr_hash)
|
67
|
+
start_element(name, attr_hash)
|
68
|
+
end
|
69
|
+
|
70
|
+
def on_end_element(name)
|
71
|
+
end_element(name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def on_reference(name)
|
75
|
+
characters(ENTITY_REF_MAP[name])
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_characters(chars)
|
79
|
+
characters(chars)
|
80
|
+
end
|
81
|
+
|
82
|
+
#def on_processing_instruction(target, data)
|
83
|
+
# nil
|
84
|
+
#end
|
85
|
+
|
86
|
+
#def on_comment(msg)
|
87
|
+
# nil
|
88
|
+
#end
|
89
|
+
|
90
|
+
def on_parser_warning(msg)
|
91
|
+
warn(msg)
|
92
|
+
end
|
93
|
+
|
94
|
+
def on_parser_error(msg)
|
95
|
+
raise ParseError.new(msg)
|
96
|
+
end
|
97
|
+
|
98
|
+
def on_parser_fatal_error(msg)
|
99
|
+
raise ParseError.new(msg)
|
100
|
+
end
|
101
|
+
|
102
|
+
def on_cdata_block(cdata)
|
103
|
+
characters(cdata)
|
104
|
+
end
|
105
|
+
|
106
|
+
def on_external_subset(name, external_id, system_id)
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
add_factory(self)
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# XSD4R - XML Instance parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/qname'
|
10
|
+
require 'xsd/ns'
|
11
|
+
require 'xsd/charset'
|
12
|
+
|
13
|
+
|
14
|
+
module XSD
|
15
|
+
module XMLParser
|
16
|
+
|
17
|
+
|
18
|
+
class Parser
|
19
|
+
class ParseError < Error; end
|
20
|
+
class FormatDecodeError < ParseError; end
|
21
|
+
class UnknownElementError < FormatDecodeError; end
|
22
|
+
class UnknownAttributeError < FormatDecodeError; end
|
23
|
+
class UnexpectedElementError < FormatDecodeError; end
|
24
|
+
class ElementConstraintError < FormatDecodeError; end
|
25
|
+
class ParserError < ParseError; end
|
26
|
+
|
27
|
+
@@parser_factory = nil
|
28
|
+
|
29
|
+
def self.factory
|
30
|
+
@@parser_factory
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create_parser(host, opt = {})
|
34
|
+
unless @@parser_factory
|
35
|
+
raise ParserError.new("illegal XML parser configuration")
|
36
|
+
end
|
37
|
+
@@parser_factory.new(host, opt)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.add_factory(factory)
|
41
|
+
if $DEBUG
|
42
|
+
puts "Set #{ factory } as XML processor."
|
43
|
+
end
|
44
|
+
@@parser_factory = factory
|
45
|
+
end
|
46
|
+
|
47
|
+
public
|
48
|
+
|
49
|
+
attr_accessor :charset
|
50
|
+
|
51
|
+
def initialize(host, opt = {})
|
52
|
+
@host = host
|
53
|
+
@charset = opt[:charset] || nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse(string_or_readable)
|
57
|
+
@textbuf = ''
|
58
|
+
prologue
|
59
|
+
do_parse(string_or_readable)
|
60
|
+
epilogue
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def do_parse(string_or_readable)
|
66
|
+
raise ParserError.new(
|
67
|
+
'Method do_parse must be defined in derived class.')
|
68
|
+
end
|
69
|
+
|
70
|
+
def start_element(name, attrs)
|
71
|
+
@host.start_element(name, attrs)
|
72
|
+
end
|
73
|
+
|
74
|
+
def characters(text)
|
75
|
+
@host.characters(text)
|
76
|
+
end
|
77
|
+
|
78
|
+
def end_element(name)
|
79
|
+
@host.end_element(name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def prologue
|
83
|
+
end
|
84
|
+
|
85
|
+
def epilogue
|
86
|
+
end
|
87
|
+
|
88
|
+
def xmldecl_encoding=(charset)
|
89
|
+
if @charset.nil?
|
90
|
+
@charset = charset
|
91
|
+
else
|
92
|
+
# Definition in a stream (like HTTP) has a priority.
|
93
|
+
p "encoding definition: #{ charset } is ignored." if $DEBUG
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# XSD4R - REXMLParser XML parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/xmlparser'
|
10
|
+
require 'rexml/streamlistener'
|
11
|
+
require 'rexml/document'
|
12
|
+
|
13
|
+
|
14
|
+
module XSD
|
15
|
+
module XMLParser
|
16
|
+
|
17
|
+
|
18
|
+
class REXMLParser < XSD::XMLParser::Parser
|
19
|
+
include REXML::StreamListener
|
20
|
+
|
21
|
+
def do_parse(string_or_readable)
|
22
|
+
source = nil
|
23
|
+
source = REXML::SourceFactory.create_from(string_or_readable)
|
24
|
+
source.encoding = charset if charset
|
25
|
+
# Listener passes a String in utf-8.
|
26
|
+
@charset = 'utf-8'
|
27
|
+
REXML::Document.parse_stream(source, self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def epilogue
|
31
|
+
end
|
32
|
+
|
33
|
+
def tag_start(name, attrs)
|
34
|
+
start_element(name, attrs)
|
35
|
+
end
|
36
|
+
|
37
|
+
def tag_end(name)
|
38
|
+
end_element(name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def text(text)
|
42
|
+
characters(text)
|
43
|
+
end
|
44
|
+
|
45
|
+
def cdata(content)
|
46
|
+
characters(content)
|
47
|
+
end
|
48
|
+
|
49
|
+
def xmldecl(version, encoding, standalone)
|
50
|
+
# Version should be checked.
|
51
|
+
end
|
52
|
+
|
53
|
+
add_factory(self)
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# XSD4R - XMLParser XML parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/xmlparser'
|
10
|
+
require 'xml/parser'
|
11
|
+
|
12
|
+
|
13
|
+
module XSD
|
14
|
+
module XMLParser
|
15
|
+
|
16
|
+
|
17
|
+
class XMLParser < XSD::XMLParser::Parser
|
18
|
+
class Listener < XML::Parser
|
19
|
+
begin
|
20
|
+
require 'xml/encoding-ja'
|
21
|
+
include XML::Encoding_ja
|
22
|
+
rescue LoadError
|
23
|
+
# uconv may not be installed.
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def do_parse(string_or_readable)
|
28
|
+
# XMLParser passes a String in utf-8.
|
29
|
+
@charset = 'utf-8'
|
30
|
+
@parser = Listener.new
|
31
|
+
@parser.parse(string_or_readable) do |type, name, data|
|
32
|
+
case type
|
33
|
+
when XML::Parser::START_ELEM
|
34
|
+
start_element(name, data)
|
35
|
+
when XML::Parser::END_ELEM
|
36
|
+
end_element(name)
|
37
|
+
when XML::Parser::CDATA
|
38
|
+
characters(data)
|
39
|
+
else
|
40
|
+
raise FormatDecodeError.new("Unexpected XML: #{ type }/#{ name }/#{ data }.")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
add_factory(self)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# XSD4R - XMLScan XML parser library.
|
2
|
+
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
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
|
+
|
9
|
+
require 'xsd/xmlparser'
|
10
|
+
require 'xmlscan/scanner'
|
11
|
+
|
12
|
+
|
13
|
+
module XSD
|
14
|
+
module XMLParser
|
15
|
+
|
16
|
+
|
17
|
+
class XMLScanner < XSD::XMLParser::Parser
|
18
|
+
include XMLScan::Visitor
|
19
|
+
|
20
|
+
def do_parse(string_or_readable)
|
21
|
+
@attrs = {}
|
22
|
+
@curattr = nil
|
23
|
+
@scanner = XMLScan::XMLScanner.new(self)
|
24
|
+
@scanner.kcode = XSD::Charset.charset_str(charset) if charset
|
25
|
+
@scanner.parse(string_or_readable)
|
26
|
+
end
|
27
|
+
|
28
|
+
def scanner_kcode=(charset)
|
29
|
+
@scanner.kcode = XSD::Charset.charset_str(charset) if charset
|
30
|
+
self.xmldecl_encoding = charset
|
31
|
+
end
|
32
|
+
|
33
|
+
ENTITY_REF_MAP = {
|
34
|
+
'lt' => '<',
|
35
|
+
'gt' => '>',
|
36
|
+
'amp' => '&',
|
37
|
+
'quot' => '"',
|
38
|
+
'apos' => '\''
|
39
|
+
}
|
40
|
+
|
41
|
+
def parse_error(msg)
|
42
|
+
raise ParseError.new(msg)
|
43
|
+
end
|
44
|
+
|
45
|
+
def wellformed_error(msg)
|
46
|
+
raise NotWellFormedError.new(msg)
|
47
|
+
end
|
48
|
+
|
49
|
+
def valid_error(msg)
|
50
|
+
raise NotValidError.new(msg)
|
51
|
+
end
|
52
|
+
|
53
|
+
def warning(msg)
|
54
|
+
warn(msg)
|
55
|
+
end
|
56
|
+
|
57
|
+
# def on_xmldecl; end
|
58
|
+
|
59
|
+
def on_xmldecl_version(str)
|
60
|
+
# 1.0 expected.
|
61
|
+
end
|
62
|
+
|
63
|
+
def on_xmldecl_encoding(str)
|
64
|
+
self.scanner_kcode = str
|
65
|
+
end
|
66
|
+
|
67
|
+
# def on_xmldecl_standalone(str); end
|
68
|
+
|
69
|
+
# def on_xmldecl_other(name, value); end
|
70
|
+
|
71
|
+
# def on_xmldecl_end; end
|
72
|
+
|
73
|
+
# def on_doctype(root, pubid, sysid); end
|
74
|
+
|
75
|
+
# def on_prolog_space(str); end
|
76
|
+
|
77
|
+
# def on_comment(str); end
|
78
|
+
|
79
|
+
# def on_pi(target, pi); end
|
80
|
+
|
81
|
+
def on_chardata(str)
|
82
|
+
characters(str)
|
83
|
+
end
|
84
|
+
|
85
|
+
def on_cdata(str)
|
86
|
+
characters(str)
|
87
|
+
end
|
88
|
+
|
89
|
+
def on_etag(name)
|
90
|
+
end_element(name)
|
91
|
+
end
|
92
|
+
|
93
|
+
def on_entityref(ref)
|
94
|
+
characters(ENTITY_REF_MAP[ref])
|
95
|
+
end
|
96
|
+
|
97
|
+
def on_charref(code)
|
98
|
+
characters([code].pack('U'))
|
99
|
+
end
|
100
|
+
|
101
|
+
def on_charref_hex(code)
|
102
|
+
on_charref(code)
|
103
|
+
end
|
104
|
+
|
105
|
+
# def on_start_document; end
|
106
|
+
|
107
|
+
# def on_end_document; end
|
108
|
+
|
109
|
+
def on_stag(name)
|
110
|
+
@attrs = {}
|
111
|
+
end
|
112
|
+
|
113
|
+
def on_attribute(name)
|
114
|
+
@attrs[name] = @curattr = ''
|
115
|
+
end
|
116
|
+
|
117
|
+
def on_attr_value(str)
|
118
|
+
@curattr << str
|
119
|
+
end
|
120
|
+
|
121
|
+
def on_attr_entityref(ref)
|
122
|
+
@curattr << ENTITY_REF_MAP[ref]
|
123
|
+
end
|
124
|
+
|
125
|
+
def on_attr_charref(code)
|
126
|
+
@curattr << [code].pack('U')
|
127
|
+
end
|
128
|
+
|
129
|
+
def on_attr_charref_hex(code)
|
130
|
+
on_attr_charref(code)
|
131
|
+
end
|
132
|
+
|
133
|
+
# def on_attribute_end(name); end
|
134
|
+
|
135
|
+
def on_stag_end_empty(name)
|
136
|
+
on_stag_end(name)
|
137
|
+
on_etag(name)
|
138
|
+
end
|
139
|
+
|
140
|
+
def on_stag_end(name)
|
141
|
+
start_element(name, @attrs)
|
142
|
+
end
|
143
|
+
|
144
|
+
add_factory(self)
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|