validate_xml_xsi 0.2.4 → 0.3.0
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/bin/validate_xml_xsi +1 -1
- data/lib/validate_xml_xsi.rb +46 -29
- data/validate_xml_xsi.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aeccb816b7e38de2b2cc3b29dd0f3035e56f8bf2190f9d1281ae11ec73573efb
|
4
|
+
data.tar.gz: '0953d2190b837f8b692b468c3e06d77c55cad671a03ed4eaf2e7219e31013cc3'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 323fc0b7cd7b322ff35c72dd77ae1b33b5aee6b5bed953ed7b3e965cc7924bb98c36145a2296e279a6c6e208c9aa056e33809f00f3e9272d15b898425bc3e407
|
7
|
+
data.tar.gz: 8d79a528c2fb9172b2d0d29bcd10f67d241a792fba510b613eed501645d73cb137ed3ba0af0223b5b4cd3510025268184a42e487810428b196d17664778501a1
|
data/CHANGELOG.md
CHANGED
data/bin/validate_xml_xsi
CHANGED
data/lib/validate_xml_xsi.rb
CHANGED
@@ -14,32 +14,52 @@ class XML_XSI
|
|
14
14
|
class Schema
|
15
15
|
class DocumentError < StandardError; end
|
16
16
|
class ValidationError < StandardError
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
@
|
17
|
+
attr_reader :type, :file, :line, :column, :level, :message, :description, :error
|
18
|
+
def initialize(type, err, filename = nil)
|
19
|
+
@type = type
|
20
|
+
@error = err
|
21
|
+
@file = filename.nil? ? @error.file : filename
|
22
|
+
@line = @error.line
|
23
|
+
@column = @error.column
|
24
|
+
if /((?:ERROR)|(?:WARNING)): /.match(@error.message)
|
25
|
+
@level = $1
|
26
|
+
@message = $'
|
27
|
+
@description = "#{@type.to_s} #{@level.to_s} [#{@file}:#{@line}:#{@column}]: #{@message}".freeze
|
28
|
+
else
|
29
|
+
@level = ''
|
30
|
+
@message = @error.message
|
31
|
+
@description = "#{@type.to_s} #{@message}".freeze
|
32
|
+
end
|
22
33
|
super(@description)
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
26
|
-
|
37
|
+
attr_reader :xsd
|
38
|
+
def initialize(xml_doc)
|
27
39
|
unless xml_doc.is_a?(Nokogiri::XML::Document)
|
28
|
-
raise DocumentError.new("
|
40
|
+
raise DocumentError.new("invalid Nokogiri::XML::Document - #{xml_doc.class.name}")
|
41
|
+
end
|
42
|
+
@document = xml_doc
|
43
|
+
## Determine default/top/root namespace
|
44
|
+
target_ns_href = nil
|
45
|
+
@document.namespaces.each do |ns_prefix, ns_href|
|
46
|
+
target_ns_href = ns_href if ns_prefix.nil? || ns_prefix.empty? || ns_prefix.eql?('xmlns')
|
29
47
|
end
|
48
|
+
raise DocumentError.new("Unable to determine default (xmlns) namespace!") if target_ns_href.nil? || target_ns_href.empty?
|
30
49
|
## Build an all-in-one XSD document that imports all of the separate schema locations
|
31
|
-
|
32
|
-
|
33
|
-
"
|
50
|
+
@xsd = "<?xml version=\"1.0\"?>\n"
|
51
|
+
@xsd << "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" \
|
52
|
+
" targetNamespace=\"#{target_ns_href}\"\n" \
|
34
53
|
" version=\"1.0\">\n"
|
54
|
+
## Include the default xml namespace
|
55
|
+
schemata_by_ns = {}
|
35
56
|
## Iterate over all the elements and find any xsi:schemaLocation attributes
|
36
57
|
## and build a hash of all of the namespaces and locations
|
37
|
-
|
38
|
-
xml_doc.search('//*[@xsi:schemaLocation]').each do |elem|
|
58
|
+
@document.search('//*[@xsi:schemaLocation]').each do |elem|
|
39
59
|
elem['xsi:schemaLocation'].scan(/(\S+)\s+(\S+)/).each do |ns_set|
|
40
60
|
if ns_loc = schemata_by_ns[ns_set.first]
|
41
61
|
unless ns_loc.eql?(ns_set.last)
|
42
|
-
raise DocumentError.new("MISMATCHING
|
62
|
+
raise DocumentError.new("MISMATCHING namespace: #{ns_set.first} -> #{ns_loc} VS #{ns_set.last}")
|
43
63
|
end
|
44
64
|
else
|
45
65
|
schemata_by_ns[ns_set.first] = ns_set.last
|
@@ -47,28 +67,25 @@ class XML_XSI
|
|
47
67
|
end
|
48
68
|
end
|
49
69
|
schemata_by_ns.each do |ns_href, ns_file|
|
50
|
-
|
70
|
+
@xsd << (ns_href.eql?(target_ns_href) ?
|
71
|
+
" <xsd:include schemaLocation=\"#{ns_file}\"/>\n" :
|
72
|
+
" <xsd:import namespace=\"#{ns_href}\" schemaLocation=\"#{ns_file}\"/>\n")
|
51
73
|
end
|
52
|
-
|
53
|
-
|
74
|
+
@xsd << "</xsd:schema>\n"
|
75
|
+
|
76
|
+
## Create the Schema objects
|
77
|
+
@schema = Nokogiri::XML::Schema.new(@xsd)
|
54
78
|
end
|
55
79
|
|
56
|
-
def
|
57
|
-
xml_doc = XML_XSI::parse(xml_doc) unless xml_doc.is_a?(Nokogiri::XML::Document)
|
80
|
+
def validate
|
58
81
|
errors = []
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
xsd = self.parse(xml_doc) if xsd.nil?
|
63
|
-
xsd.errors.each do |err|
|
64
|
-
err_msg = (/ERROR: /.match(err.message)) ? $' : err.message
|
65
|
-
errors << ValidationError.new(:XSD, err.file, err.line, err.column, err_msg, err)
|
82
|
+
@schema.errors.each do |err|
|
83
|
+
errors << ValidationError.new(:XSD, err)
|
66
84
|
end
|
67
|
-
errs =
|
85
|
+
errs = @schema.validate(@document)
|
68
86
|
errs.each do |err|
|
69
|
-
|
70
|
-
|
71
|
-
errors << ValidationError.new(:XML, fname, err.line, err.column, err_msg, err)
|
87
|
+
fname = (err.file.nil?) ? @document.filename : err.file
|
88
|
+
errors << ValidationError.new(:XML, err, fname)
|
72
89
|
end
|
73
90
|
errors
|
74
91
|
end
|
data/validate_xml_xsi.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validate_xml_xsi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Hansen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|