xml-smart 0.3.12 → 0.3.14
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/README.rdoc +26 -0
- data/example/EXAMPLE.xml +1 -1
- data/lib/xml/smart.rb +43 -7
- data/lib/xml/smart_dom.rb +2 -1
- data/lib/xml/smart_domelement.rb +1 -5
- data/test/EXAMPLE.xml +1 -1
- data/test/concurrent.xml +7 -1
- data/xml-smart.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fa0cb5980990dae96d416b9122d90882d1ef5ae
|
4
|
+
data.tar.gz: 26a3c1597a503cee447ab4eccd226d564d34ade5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cfd22611b531f7121c314edfcfee7830da6cd69f5e654020b238aad6582e0b08252e0d2885450cec4ac349d3735278c20937d8e8ddea3227b680ad016f31349
|
7
|
+
data.tar.gz: 0b52ff70a78c074914b6bda148d02b5ade3cfc19140b8eab1d319d1406f6ca3c95003b350bad97e3bb884ed0a30e717a9285001dc3a56c7667322c921b5862bc
|
data/README.rdoc
CHANGED
@@ -47,6 +47,32 @@ Register your own shortcusts to be available in all XPaths:
|
|
47
47
|
doc.root.add "test_node"
|
48
48
|
end
|
49
49
|
|
50
|
+
=== check against relaxng and xml schema
|
51
|
+
|
52
|
+
Libxml2, the basis for nokogiri has only partial xml-schema support, but full
|
53
|
+
relaxng support. Thus checking against xml-schema with nokogiri may return
|
54
|
+
positive results, although it is a lie. XML::Smart internally converts
|
55
|
+
xml-schema to relaxng, thus allowing for seamless schema usage:
|
56
|
+
|
57
|
+
doc = XML::Smart.string('<test xmlns:aaa="uri:aaa"><aaa:test/></test>')
|
58
|
+
doc.validate_against(XML::Smart.open_unprotected('xmlschema.xml'))
|
59
|
+
doc.validate_against(XML::Smart.open_unprotected('xmlschema.xml'))
|
60
|
+
doc.find('string(a:test)')
|
61
|
+
doc.close
|
62
|
+
|
63
|
+
=== xinclude
|
64
|
+
|
65
|
+
Libxml2, the basis for nokogiri does not support https xincludes. Nokogiri may
|
66
|
+
impelement this in the future (issue
|
67
|
+
https://github.com/sparklemotion/nokogiri/issues/1321), but for now we do
|
68
|
+
support it:
|
69
|
+
|
70
|
+
doc.xinclude!
|
71
|
+
|
72
|
+
or
|
73
|
+
|
74
|
+
doc.find('//someelement').first.xinclude!
|
75
|
+
|
50
76
|
== Changes since 0.2.x (see Changelog)
|
51
77
|
|
52
78
|
- qname instead of name
|
data/example/EXAMPLE.xml
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
<name team="1">J�rgen</name>
|
6
6
|
<name team="1">Michel</name>
|
7
7
|
<name team="1">Raphi</name>
|
8
|
-
<name team="2">Kathrin <b>Fiedler</b> MBA</name>
|
8
|
+
<name xmlns:doc="arrra" soap:team="2">Kathrin <b>Fiedler</b> MBA</name>
|
9
9
|
<name team="5">egon</name>
|
10
10
|
</names>
|
11
11
|
<colors>
|
data/lib/xml/smart.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'tempfile'
|
4
|
+
require 'open-uri'
|
5
|
+
require 'openssl'
|
4
6
|
|
5
7
|
require File.expand_path(File.dirname(__FILE__) + '/smart_qname')
|
6
8
|
require File.expand_path(File.dirname(__FILE__) + '/smart_dom')
|
@@ -26,6 +28,13 @@ module Nokogiri
|
|
26
28
|
self
|
27
29
|
end
|
28
30
|
|
31
|
+
def basepath=(path)
|
32
|
+
@basepath = File.dirname(path.to_s)
|
33
|
+
end
|
34
|
+
def basepath
|
35
|
+
@basepath || ''
|
36
|
+
end
|
37
|
+
|
29
38
|
def xpath_fast(path)
|
30
39
|
ns = self.custom_namespace_prefixes.merge(self.document.user_custom_namespace_prefixes)
|
31
40
|
ctx = XPathContext.new(self)
|
@@ -84,6 +93,26 @@ module Nokogiri
|
|
84
93
|
ctx.evaluate(path)
|
85
94
|
end
|
86
95
|
|
96
|
+
def do_xinclude_manual(relative_to=nil)
|
97
|
+
path = ((relative_to || self.document.basepath.to_s) + '/').sub(/\/+$/,'/')
|
98
|
+
ctx = XPathContext.new(self)
|
99
|
+
ctx.register_namespaces "xi"=>"http://www.w3.org/2001/XInclude"
|
100
|
+
ctx.evaluate('//xi:include').each do |ele|
|
101
|
+
name = ele.attributes['href'].value
|
102
|
+
name = path + name if name !~ /^(https?:|ftp:)/
|
103
|
+
content = open(name,{ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}).read
|
104
|
+
insert = begin
|
105
|
+
Nokogiri::XML::parse(content){|config| config.noblanks.noent.nsclean.strict }.root
|
106
|
+
rescue
|
107
|
+
content
|
108
|
+
end
|
109
|
+
x = ele.replace insert
|
110
|
+
x.each do |n|
|
111
|
+
n.do_xinclude_manual if n.is_a? Nokogiri::XML::Element
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
87
116
|
def xpath_experimental
|
88
117
|
return NodeSet.new(document) unless document
|
89
118
|
@nsc ||= 0
|
@@ -119,15 +148,15 @@ module XML
|
|
119
148
|
io = ::Kernel::open(name,'r+')
|
120
149
|
io.flock(File::LOCK_EX)
|
121
150
|
end
|
122
|
-
dom = Dom.new Nokogiri::XML::parse(io){|config| config.noblanks.noent.nsclean.strict }
|
151
|
+
dom = Dom.new Nokogiri::XML::parse(io){|config| config.noblanks.noent.nsclean.strict }, name
|
123
152
|
io.rewind
|
124
153
|
elsif name.is_a?(String) && !File.exists?(name)
|
125
154
|
MUTEX.synchronize do
|
126
155
|
io = ::Kernel::open(name,'w')
|
127
156
|
io.flock(File::LOCK_EX)
|
128
157
|
end
|
129
|
-
dom = Smart::string(default)
|
130
|
-
elsif name.is_a?(IO) || name.is_a?(Tempfile)
|
158
|
+
dom = Smart::string(default,name)
|
159
|
+
elsif name.is_a?(IO) || name.is_a?(Tempfile)
|
131
160
|
MUTEX.synchronize do
|
132
161
|
io = name
|
133
162
|
io.flock(File::LOCK_EX)
|
@@ -167,10 +196,17 @@ module XML
|
|
167
196
|
raise Error, 'first parameter has to be a filename or filehandle' unless name.is_a?(String) || name.is_a?(IO) || name.is_a?(Tempfile)
|
168
197
|
raise Error, 'second parameter has to be an xml string' unless default.is_a?(String) || default.nil?
|
169
198
|
dom = begin
|
170
|
-
|
199
|
+
filename = nil
|
200
|
+
io = if name.is_a?(String)
|
201
|
+
filename = name
|
202
|
+
::Kernel::open(name)
|
203
|
+
else
|
204
|
+
filename = name.path
|
205
|
+
name
|
206
|
+
end
|
171
207
|
begin
|
172
208
|
io.flock(File::LOCK_EX) if lock
|
173
|
-
Dom.new Nokogiri::XML::parse(io){|config| config.noblanks.noent.nsclean.strict }
|
209
|
+
Dom.new Nokogiri::XML::parse(io){|config| config.noblanks.noent.nsclean.strict }, filename
|
174
210
|
ensure
|
175
211
|
io.flock(File::LOCK_UN)
|
176
212
|
end
|
@@ -190,9 +226,9 @@ module XML
|
|
190
226
|
end
|
191
227
|
end
|
192
228
|
|
193
|
-
def self::string(str)
|
229
|
+
def self::string(str,basepath=nil)
|
194
230
|
raise Error, 'first parameter has to be stringable (:to_s)' unless str.is_a?(String)
|
195
|
-
dom = Dom.new Nokogiri::XML::parse(str.to_s){|config| config.noblanks.noent.nsclean.strict }
|
231
|
+
dom = Dom.new Nokogiri::XML::parse(str.to_s){|config| config.noblanks.noent.nsclean.strict }, basepath
|
196
232
|
if block_given?
|
197
233
|
yield dom
|
198
234
|
nil
|
data/lib/xml/smart_dom.rb
CHANGED
data/lib/xml/smart_domelement.rb
CHANGED
@@ -160,11 +160,7 @@ module XML
|
|
160
160
|
def namespaces; NamespaceSet.new(self,@element); end
|
161
161
|
|
162
162
|
def xinclude!(basedir=nil)
|
163
|
-
|
164
|
-
Dir.chdir(basedir) { @element.do_xinclude Nokogiri::XML::ParseOptions::STRICT }
|
165
|
-
else
|
166
|
-
@element.do_xinclude Nokogiri::XML::ParseOptions::STRICT
|
167
|
-
end
|
163
|
+
@element.do_xinclude_manual(basedir)
|
168
164
|
@element.document.custom_namespace_prefixes_update
|
169
165
|
@element.document.ns_update
|
170
166
|
true
|
data/test/EXAMPLE.xml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
<test xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xml:lang="de">
|
2
2
|
<names>
|
3
|
-
<name team="0" a="3">2015-
|
3
|
+
<name team="0" a="3">2015-07-23 21:37:19 +0200</name>
|
4
4
|
<name team="1">Jürgen</name>
|
5
5
|
<name team="1">Michel</name>
|
6
6
|
<name team="1">Raphi</name>
|
data/test/concurrent.xml
CHANGED
@@ -1 +1,7 @@
|
|
1
|
-
<solutions
|
1
|
+
<solutions>
|
2
|
+
<solution matnr="9906264" name="mangler" secid="1" when="2015-07-23T21:37:19+02:00" assessment="16">
|
3
|
+
<question block="1" question="2"/>
|
4
|
+
<question block="2" question="4"/>
|
5
|
+
<question block="3" question="6"/>
|
6
|
+
</solution>
|
7
|
+
</solutions>
|
data/xml-smart.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-smart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|