xml-motor 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/xml-motor.rb +46 -31
- data/lib/xml-motor/version.rb +1 -1
- metadata +33 -42
data/lib/xml-motor.rb
CHANGED
@@ -1,39 +1,48 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
module XMLStdout
|
4
|
+
def self._err(mesag); puts "ERROR:: #{mesag}"; end
|
5
|
+
def self._nfo(mesag); puts "INFORMATION:: #{mesag}"; end
|
6
|
+
end
|
7
|
+
|
3
8
|
module XMLIndexHandler
|
4
9
|
def self.get_node_indexes(xml_motor, tag)
|
5
|
-
|
10
|
+
xml_idx_to_find = []
|
11
|
+
begin
|
6
12
|
xml_motor.xmltags[tag.split(".")[0]].each_value {|val| xml_idx_to_find.push val }
|
7
13
|
xml_idx_to_find = xml_idx_to_find.flatten
|
8
14
|
|
9
15
|
tag.split(".")[1..-1].each do |tag_i|
|
10
16
|
outer_idx = xml_idx_to_find
|
11
|
-
|
12
|
-
x_curr=[]
|
17
|
+
x_curr = []
|
13
18
|
xml_motor.xmltags[tag_i].each_value {|val| x_curr.push val }
|
14
19
|
x_curr = x_curr.flatten
|
15
|
-
xsize=x_curr.size/2 -1
|
16
20
|
|
17
|
-
xml_idx_to_find = expand_node_indexes outer_idx,
|
21
|
+
xml_idx_to_find = expand_node_indexes outer_idx, x_curr
|
18
22
|
end
|
19
|
-
|
23
|
+
rescue
|
24
|
+
XMLStdout._err "Finding index for tag:#{tag}.\nLook if it's actually present in the provided XML."
|
25
|
+
end
|
26
|
+
xml_idx_to_find
|
20
27
|
end
|
21
28
|
|
22
|
-
def self.expand_node_indexes(outer_idx,
|
23
|
-
|
29
|
+
def self.expand_node_indexes(outer_idx, x_curr)
|
30
|
+
osize = outer_idx.size/2 -1
|
31
|
+
xsize = x_curr.size/2 -1
|
32
|
+
expanded_node_indexes = []
|
24
33
|
0.upto osize do |o|
|
25
|
-
o1=outer_idx[o*2]
|
26
|
-
o2=outer_idx[o*2 +1]
|
34
|
+
o1 = outer_idx[o*2]
|
35
|
+
o2 = outer_idx[o*2 +1]
|
27
36
|
0.upto xsize do |x|
|
28
|
-
x1=x_curr[x*2]
|
29
|
-
x2=x_curr[x*2 +1]
|
37
|
+
x1 = x_curr[x*2]
|
38
|
+
x2 = x_curr[x*2 +1]
|
30
39
|
unless o1>x1 or o2<x2
|
31
|
-
|
32
|
-
|
40
|
+
expanded_node_indexes.push x1
|
41
|
+
expanded_node_indexes.push x2
|
33
42
|
end
|
34
43
|
end
|
35
44
|
end
|
36
|
-
|
45
|
+
expanded_node_indexes.flatten
|
37
46
|
end
|
38
47
|
end
|
39
48
|
|
@@ -71,7 +80,7 @@ end
|
|
71
80
|
module XMLJoiner
|
72
81
|
def self.dejavu_attributes(attrib_hash)
|
73
82
|
return nil if attrib_hash.nil?
|
74
|
-
attributes=""
|
83
|
+
attributes = ""
|
75
84
|
attrib_hash.each_key do |hash_key|
|
76
85
|
attributes += " " + hash_key + "=" + attrib_hash[hash_key]
|
77
86
|
end
|
@@ -84,10 +93,11 @@ end
|
|
84
93
|
|
85
94
|
module XMLMotorEngine
|
86
95
|
def self._splitter_(xmldata)
|
87
|
-
@xmlnodes=[xmldata.split(/</)[0]]
|
96
|
+
@xmlnodes = [xmldata.split(/</)[0]]
|
88
97
|
xmldata.split(/</)[1..-1].each do |x1|
|
89
98
|
@xmlnodes.push XMLChopper.get_tag_attrib_value(x1)
|
90
99
|
end
|
100
|
+
@xmlnodes
|
91
101
|
end
|
92
102
|
|
93
103
|
def self._indexify_(_nodes=nil)
|
@@ -96,7 +106,7 @@ module XMLMotorEngine
|
|
96
106
|
idx = 1
|
97
107
|
depth = 0
|
98
108
|
@xmlnodes[1..-1].each do |xnode|
|
99
|
-
tag_name = xnode[0][0]
|
109
|
+
tag_name = xnode[0][0].strip
|
100
110
|
unless tag_name.match(/^\/.*/) then
|
101
111
|
@xmltags[tag_name] ||= {}
|
102
112
|
@xmltags[tag_name][depth] ||= []
|
@@ -109,6 +119,7 @@ module XMLMotorEngine
|
|
109
119
|
end
|
110
120
|
idx +=1
|
111
121
|
end
|
122
|
+
@xmltags
|
112
123
|
end
|
113
124
|
|
114
125
|
def self._grab_my_node_ (xml_to_find, attrib_to_find=nil)
|
@@ -129,7 +140,7 @@ module XMLMotorEngine
|
|
129
140
|
nodes[ncount] += @xmlnodes[node_start][1] unless @xmlnodes[node_start][1].nil?
|
130
141
|
(node_start+1).upto (node_stop-1) do |node_idx|
|
131
142
|
any_attrib ||= ""
|
132
|
-
any_attrib =
|
143
|
+
any_attrib = XMLJoiner.dejavu_attributes(@xmlnodes[node_idx][0][1]).to_s unless @xmlnodes[node_idx][0][1].nil?
|
133
144
|
nodes[ncount] += "<" + @xmlnodes[node_idx][0][0] + any_attrib + ">"
|
134
145
|
nodes[ncount] += @xmlnodes[node_idx][1] unless @xmlnodes[node_idx][1].nil?
|
135
146
|
end
|
@@ -140,14 +151,15 @@ module XMLMotorEngine
|
|
140
151
|
|
141
152
|
def self.xml_extracter(tag_to_find=nil, attrib_to_find=nil)
|
142
153
|
my_nodes = nil
|
143
|
-
if attrib_to_find.nil?
|
154
|
+
if attrib_to_find.nil? and tag_to_find.nil?
|
155
|
+
elsif attrib_to_find.nil?
|
144
156
|
xml_to_find = XMLIndexHandler.get_node_indexes self, tag_to_find
|
145
157
|
my_nodes = _grab_my_node_ xml_to_find
|
146
158
|
elsif tag_to_find.nil?
|
147
159
|
#
|
148
|
-
|
160
|
+
XMLStdout._nfo "Just attrib-based search to come"
|
149
161
|
#
|
150
|
-
|
162
|
+
else
|
151
163
|
xml_to_find = XMLIndexHandler.get_node_indexes self, tag_to_find
|
152
164
|
my_nodes = _grab_my_node_ xml_to_find, attrib_to_find
|
153
165
|
end
|
@@ -155,17 +167,20 @@ module XMLMotorEngine
|
|
155
167
|
end
|
156
168
|
|
157
169
|
def self.xml_miner(xmldata, tag_to_find=nil, attrib_to_find=nil)
|
170
|
+
return nil if xmldata.nil?
|
158
171
|
_splitter_ xmldata
|
159
172
|
_indexify_
|
160
173
|
xml_extracter tag_to_find, attrib_to_find
|
161
174
|
end
|
162
175
|
|
163
|
-
def self.xmlnodes(
|
164
|
-
@xmlnodes
|
176
|
+
def self.xmlnodes(xml_nodes=nil)
|
177
|
+
@xmlnodes = xml_nodes unless xml_nodes.nil?
|
178
|
+
@xmlnodes
|
165
179
|
end
|
166
180
|
|
167
|
-
def self.xmltags(
|
168
|
-
@xmltags
|
181
|
+
def self.xmltags(xml_tags=nil)
|
182
|
+
@xmltags = xml_tags unless xml_tags.nil?
|
183
|
+
@xmltags
|
169
184
|
end
|
170
185
|
|
171
186
|
def self.pre_processed_content(_nodes, _tags=nil, tag_to_find=nil, attrib_to_find=nil)
|
@@ -174,13 +189,13 @@ module XMLMotorEngine
|
|
174
189
|
unless _tags.nil?
|
175
190
|
xmltags _tags
|
176
191
|
else
|
177
|
-
_indexify_
|
192
|
+
_indexify_
|
178
193
|
end
|
179
194
|
return xml_extracter tag_to_find, attrib_to_find
|
180
195
|
rescue
|
181
|
-
|
196
|
+
XMLStdout._err "Parsing processed XML Nodes."
|
182
197
|
end
|
183
|
-
return
|
198
|
+
return nil
|
184
199
|
end
|
185
200
|
end
|
186
201
|
|
@@ -192,7 +207,7 @@ module XMLMotor
|
|
192
207
|
begin
|
193
208
|
return get_node_from_content(File.read(file.to_s), my_tag, my_attrib) if File.readable? file.to_s
|
194
209
|
rescue
|
195
|
-
|
210
|
+
XMLStdout._err "#{file} is not readable."
|
196
211
|
end
|
197
212
|
return ""
|
198
213
|
end
|
@@ -201,7 +216,7 @@ module XMLMotor
|
|
201
216
|
begin
|
202
217
|
return XMLMotorEngine.xml_miner content, my_tag, my_attrib unless content.nil?
|
203
218
|
rescue
|
204
|
-
|
219
|
+
XMLStdout._err "Parsing String Content #{content}"
|
205
220
|
end
|
206
221
|
return ""
|
207
222
|
end
|
data/lib/xml-motor/version.rb
CHANGED
metadata
CHANGED
@@ -1,40 +1,28 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-motor
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- abhishekkr
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
11
|
+
|
12
|
+
date: 2011-12-25 00:00:00 +05:30
|
13
|
+
default_executable:
|
13
14
|
dependencies: []
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
\ Loading:\n + $ gem install xml-motor\n + 'require' the 'xml-motor'\n\n
|
18
|
-
\ Usage:\n [[ To Search Just One QUERY ]]\n nodes_array
|
19
|
-
= XMLMotor.get_node_from_file \"_XML_FILE_\"\n nodes_array = XMLMotor.get_node_from_file
|
20
|
-
\"_XML_FILE_\", \"ATTRIB_KEY=ATTRIB_VALUE\"\n nodes_array = XMLMotor.get_node_from_content
|
21
|
-
\"_XML_DATA_\"\n nodes_array = XMLMotor.get_node_from_content \"_XML_DATA_\",
|
22
|
-
\"ATTRIB_KEY=ATTRIB_VALUE\"\n [[ To Search More Than One QUERIES ]]\n
|
23
|
-
\ str = {XML_DATA}\n nodes_ = XMLMotorEngine._splitter_ str\n
|
24
|
-
\ tags_ = XMLMotorEngine._indexify_ nodes_\n nodes_array
|
25
|
-
= XMLMotorEngine.pre_processed_content nodes_, tags_, \"_TAG_\"\n nodes_array
|
26
|
-
= XMLMotorEngine.pre_processed_content nodes_, tags_, \"_TAG_\", \"ATTRIB_KEY=ATTRIB_VALUE\"\n\n
|
27
|
-
\ Example Calls As Code:\n + XMLMotor.get_node_from_content \"<A>a</A><B><A>ba</A></B>\",
|
28
|
-
\"A\"\n RETURNS: [\"a\", \"ba\"]\n + XMLMotor.get_node_from_content
|
29
|
-
\"<A>a</A><B><A>ba</A></B>\", \"B.A\"\n RETURNS: [\"ba\"]\n +
|
30
|
-
XMLMotor.get_node_from_content \"<A i='1'>a</A><B><A i='2'>ba</A></B>\", \"A\",
|
31
|
-
\"i='1'\"\n RETURNS: [\"a\"]\n "
|
32
|
-
email:
|
15
|
+
|
16
|
+
description: "A new short XML Parsing Algorithm implemented directly in >500 lines. An easy-to-use XML Parser without any Native Dependencies. [How To Use]: https://github.com/abhishekkr/rubygem_xml_motor/raw/master/README Loading: + $ gem install xml-motor + 'require' the 'xml-motor' Usage: [[ To Search Just One QUERY ]] nodes_array = XMLMotor.get_node_from_file \"_XML_FILE_\" nodes_array = XMLMotor.get_node_from_file \"_XML_FILE_\", \"ATTRIB_KEY=ATTRIB_VALUE\" nodes_array = XMLMotor.get_node_from_content \"_XML_DATA_\" nodes_array = XMLMotor.get_node_from_content \"_XML_DATA_\", \"ATTRIB_KEY=ATTRIB_VALUE\" [[ To Search More Than One QUERIES ]] str = {XML_DATA} nodes_ = XMLMotorEngine._splitter_ str tags_ = XMLMotorEngine._indexify_ nodes_ nodes_array = XMLMotorEngine.pre_processed_content nodes_, tags_, \"_TAG_\" nodes_array = XMLMotorEngine.pre_processed_content nodes_, tags_, \"_TAG_\", \"ATTRIB_KEY=ATTRIB_VALUE\" Example Calls As Code: + XMLMotor.get_node_from_content \"<A>a</A><B><A>ba</A></B>\", \"A\" RETURNS: [\"a\", \"ba\"] + XMLMotor.get_node_from_content \"<A>a</A><B><A>ba</A></B>\", \"B.A\" RETURNS: [\"ba\"] + XMLMotor.get_node_from_content \"<A i='1'>a</A><B><A i='2'>ba</A></B>\", \"A\", \"i='1'\" RETURNS: [\"a\"]"
|
17
|
+
email:
|
33
18
|
- abhishk@thoughtworks.com
|
34
19
|
executables: []
|
20
|
+
|
35
21
|
extensions: []
|
22
|
+
|
36
23
|
extra_rdoc_files: []
|
37
|
-
|
24
|
+
|
25
|
+
files:
|
38
26
|
- Gemfile
|
39
27
|
- README
|
40
28
|
- Rakefile
|
@@ -42,28 +30,31 @@ files:
|
|
42
30
|
- lib/xml-motor/version.rb
|
43
31
|
- make_my_gem.sh
|
44
32
|
- xml-motor.gemspec
|
33
|
+
has_rdoc: false
|
45
34
|
homepage: http://github.com/abhishekkr/rubygem_xml_motor
|
46
|
-
licenses: []
|
47
35
|
post_install_message:
|
48
36
|
rdoc_options: []
|
49
|
-
|
37
|
+
|
38
|
+
require_paths:
|
50
39
|
- lib
|
51
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
version:
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
63
52
|
requirements: []
|
53
|
+
|
64
54
|
rubyforge_project: xml-motor
|
65
|
-
rubygems_version: 1.
|
55
|
+
rubygems_version: 1.3.1
|
66
56
|
signing_key:
|
67
|
-
specification_version:
|
57
|
+
specification_version: 2
|
68
58
|
summary: An easy-to-use XML Parser without any Native Dependencies
|
69
59
|
test_files: []
|
60
|
+
|