wcapi 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/wcapi.rb +1 -1
- data/lib/wcapi/client.rb +0 -6
- data/lib/wcapi/get_location_response.rb +10 -23
- data/lib/wcapi/get_record_response.rb +27 -31
- data/lib/wcapi/open_search_response.rb +32 -59
- data/lib/wcapi/record.rb +1 -1
- data/lib/wcapi/sru_search_response.rb +22 -27
- data/test.rb +2 -2
- metadata +27 -36
- data/lib/wcapi/xpath.rb +0 -151
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e9906f8b18e19ce33ef52b1be30b257ec0bbdeff
|
4
|
+
data.tar.gz: 06b94a957a1719d8d9a4a169ac8a5ec5d4940ae4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9e56ac21e3123c6ec85d76bf229a5d9111c94176eb10f87ceea217e5bfe0bc404a1c205b072cf2f844ee75f599500a3b878e596aabe27dca4804d4f48feb2405
|
7
|
+
data.tar.gz: e7a41dc950e82aa36e2ec7b6c370f6f92b9f6101c4c80a5227cbbcd7c664f53a9dcaf3f68a556088aade9c9171669f49a26a35ea5ba6435b25484e401236aa6f
|
data/lib/wcapi.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require 'wcapi/xpath'
|
2
1
|
require 'wcapi/client'
|
3
2
|
require 'wcapi/open_search_response'
|
4
3
|
require 'wcapi/get_record_response'
|
5
4
|
require 'wcapi/get_location_response'
|
6
5
|
require 'wcapi/sru_search_response'
|
6
|
+
require 'nokogiri'
|
7
7
|
|
8
8
|
WORLDCAT_OPENSEARCH = 'http://www.worldcat.org/webservices/catalog/search/opensearch'
|
9
9
|
WORLDCAT_SRU = 'http://www.worldcat.org/webservices/catalog/search/sru'
|
data/lib/wcapi/client.rb
CHANGED
@@ -10,7 +10,6 @@ module WCAPI
|
|
10
10
|
# client = WCAPI::Client.new :query => 'query', :format => [atom|rss], :start => [position], :count => [max records], :cformat => [mla|apa], :wskey => [your world cat key
|
11
11
|
# options:
|
12
12
|
# wskey
|
13
|
-
# xmlparser [by default, rexml, but libxml supported]
|
14
13
|
#
|
15
14
|
#
|
16
15
|
# More information can be found at:
|
@@ -26,11 +25,6 @@ module WCAPI
|
|
26
25
|
|
27
26
|
def initialize(options={})
|
28
27
|
@debug = options[:debug]
|
29
|
-
#if defined?(options[:xmlparser]:
|
30
|
-
# @xmlparser = options[:xmlparser]
|
31
|
-
#else
|
32
|
-
# @xmlparser = 'rexml'
|
33
|
-
#end
|
34
28
|
@wskey = options[:wskey]
|
35
29
|
end
|
36
30
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module WCAPI
|
2
2
|
class GetLocationResponse
|
3
|
-
include WCAPI::XPath
|
3
|
+
#include WCAPI::XPath
|
4
4
|
attr_accessor :institutions, :raw
|
5
5
|
|
6
6
|
def initialize(doc)
|
@@ -18,32 +18,19 @@ module WCAPI
|
|
18
18
|
_records = Array.new()
|
19
19
|
_x = 0
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
_parser = LibXML::XML::Parser.new()
|
24
|
-
_parser.string = xml
|
25
|
-
doc = LibXML::XML::Document.new()
|
26
|
-
doc = _parser.parse
|
27
|
-
rescue
|
28
|
-
begin
|
29
|
-
require 'rexml/document'
|
30
|
-
doc = REXML::Document.new(xml)
|
31
|
-
rescue
|
32
|
-
#likely some kind of xml error
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
nodes = xpath_all(doc, "//holding")
|
21
|
+
doc = Nokogiri::XML(xml)
|
22
|
+
nodes = doc.xpath("//holding")
|
37
23
|
nodes.each { |item |
|
38
|
-
_oclc_symbol =
|
24
|
+
_oclc_symbol = item.xpath("institutionIdentifier/value[position()=1]").text
|
39
25
|
|
40
|
-
|
41
|
-
|
26
|
+
if item.xpath("electronicAddress/text") != nil
|
27
|
+
_link = item.xpath("electronicAddress/text[position()=1]").text
|
42
28
|
end
|
29
|
+
|
30
|
+
if item.xpath("holdingSimple/copiesSummary/copiesCount") != nil
|
31
|
+
_copies = item.xpath("holdingSimple/copiesSummary/copiesCount[position()=1]").text
|
32
|
+
end
|
43
33
|
|
44
|
-
if xpath_first(item, "holdingSimple/copiesSummary/copiesCount") != nil
|
45
|
-
_copies = xpath_get_text(xpath_first(item, "holdingSimple/copiesSummary/copiesCount"))
|
46
|
-
end
|
47
34
|
|
48
35
|
_instchash = {:institutionIdentifier => _oclc_symbol, :link => _link, :copies => _copies ,
|
49
36
|
:xml => item.to_s}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module WCAPI
|
2
2
|
class GetRecordResponse
|
3
|
-
include WCAPI::XPath
|
3
|
+
#include WCAPI::XPath
|
4
4
|
attr_accessor :record, :raw
|
5
5
|
|
6
6
|
def initialize(doc)
|
@@ -21,42 +21,38 @@ module WCAPI
|
|
21
21
|
_rechash = {}
|
22
22
|
_x = 0
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
rescue
|
28
|
-
#likely some kind of xml error
|
29
|
-
end
|
30
|
-
|
31
|
-
nodes = xpath_all(doc, "/record")
|
24
|
+
doc = Nokogiri::XML(xml)
|
25
|
+
doc.remove_namespaces!
|
26
|
+
nodes = doc.xpath("/record")
|
32
27
|
puts "NODE Count: " + nodes.length.to_s
|
33
28
|
nodes.each { |item |
|
34
|
-
|
35
|
-
|
36
|
-
if
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
if xpath_first(item, "datafield[@tag='7*']" ) != nil
|
42
|
-
xpath_all(item, "datafield[@tag='7*']/sufield[@code='a']").each { |i|
|
43
|
-
_author.push(xpath_get_text(i))
|
44
|
-
}
|
29
|
+
_title = item.xpath("datafield[@tag='245']/subfield[@code='a'][position()=1]").text
|
30
|
+
|
31
|
+
if item.xpath("datafield[@tag='1*']") != nil
|
32
|
+
item.xpath("datafield[@tag='1*']").each {|i|
|
33
|
+
_author.push(i.xpath("subfield[@code='a']").text)
|
34
|
+
}
|
45
35
|
end
|
46
36
|
|
47
|
-
if
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
37
|
+
if item.xpath("datafield[@tag='7*']") != nil
|
38
|
+
item.xpath("datafield[@tag='7*']").each {|i|
|
39
|
+
_author.push(i.xpath("subfield[@code='a']").text)
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
if item.xpath("controlfield[@tag='001']") != nil
|
44
|
+
_id = item.xpath("controlfield[@tag='001']").text
|
45
|
+
_link = 'http://www.worldcat.org/oclc/' + _id.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
if item.xpath("datafield[@tag='520']") != nil
|
49
|
+
_summary = item.xpath("datafield[@tag='520']/subfield[@code='a'][position()=1]").text
|
50
|
+
else
|
51
|
+
if item.xpath("datafield[@tag='500']") != nil
|
52
|
+
_summary = item.xpath("datafield[@tag='500']/subfield[@code='a'][position()=1]").text
|
57
53
|
end
|
58
54
|
end
|
59
|
-
|
55
|
+
|
60
56
|
_rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
|
61
57
|
:summary => _summary, :xml => item.to_s}
|
62
58
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module WCAPI
|
2
2
|
class OpenSearchResponse
|
3
|
-
include WCAPI::XPath
|
3
|
+
#include WCAPI::XPath
|
4
4
|
attr_accessor :header, :records, :raw
|
5
5
|
|
6
6
|
def initialize(doc)
|
@@ -25,20 +25,7 @@ module WCAPI
|
|
25
25
|
_record = Array.new()
|
26
26
|
_x = 0
|
27
27
|
|
28
|
-
|
29
|
-
require 'xml/libxml'
|
30
|
-
_parser = LibXML::XML::Parser.new()
|
31
|
-
_parser.string = xml
|
32
|
-
doc = LibXML::XML::Document.new()
|
33
|
-
doc = _parser.parse
|
34
|
-
rescue
|
35
|
-
begin
|
36
|
-
require 'rexml/document'
|
37
|
-
doc = REXML::Document.new(xml)
|
38
|
-
rescue
|
39
|
-
#likely some kind of xml error
|
40
|
-
end
|
41
|
-
end
|
28
|
+
doc = Nokogiri::XML(xml)
|
42
29
|
|
43
30
|
namespaces = {'content' => 'http://purl.org/rss/1.0/modules/content/',
|
44
31
|
'atom' => 'http://www.w3.org/2005/Atom',
|
@@ -48,31 +35,31 @@ module WCAPI
|
|
48
35
|
|
49
36
|
|
50
37
|
@header = {}
|
51
|
-
@header["totalResults"] =
|
52
|
-
@header["startIndex"] =
|
53
|
-
@header["itemsPerPage"] =
|
38
|
+
@header["totalResults"] = doc.xpath("//opensearch:totalResults").text
|
39
|
+
@header["startIndex"] = doc.xpath("//opensearch:startIndex").text
|
40
|
+
@header["itemsPerPage"] = doc.xpath("//opensearch:itemsPerPage").text
|
54
41
|
|
55
|
-
nodes =
|
42
|
+
nodes = doc.xpath("//item", namespaces)
|
56
43
|
nodes.each { |item |
|
57
|
-
_title =
|
58
|
-
if
|
59
|
-
|
60
|
-
_author.push(
|
44
|
+
_title = item.xpath("title[position()=1]", namespaces).text
|
45
|
+
if item.xpath("author/name[position()=1]", namespaces) != nil
|
46
|
+
item.xpath("author/name", namespaces).each { |i|
|
47
|
+
_author.push(i.text)
|
61
48
|
}
|
62
49
|
end
|
63
|
-
if
|
64
|
-
_link =
|
50
|
+
if item.xpath("link[position()=1]") != nil
|
51
|
+
_link = item.xpath("link[position()=1]", namespaces).text
|
65
52
|
end
|
66
53
|
|
67
54
|
if _link != ''
|
68
55
|
_id = _link.slice(_link.rindex("/")+1, _link.length-_link.rindex("/"))
|
69
56
|
end
|
70
|
-
if
|
71
|
-
_citation =
|
57
|
+
if item.xpath("content:encoded[position()=1]", namespaces) != nil
|
58
|
+
_citation = item.xpath("content:encoded[position()=1]", namespaces).text
|
72
59
|
end
|
73
60
|
|
74
|
-
if
|
75
|
-
_summary =
|
61
|
+
if item.xpath("description[position()=1]", namespaces) != nil
|
62
|
+
_summary = item.xpath("description[position()=1]", namespaces).text
|
76
63
|
end
|
77
64
|
_rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
|
78
65
|
:summary => _summary, :xml => item.to_s}
|
@@ -93,58 +80,44 @@ module WCAPI
|
|
93
80
|
_record = Array.new()
|
94
81
|
_x = 0
|
95
82
|
|
96
|
-
|
97
|
-
require 'xml/libxml'
|
98
|
-
_parser = LibXML::XML::Parser.new()
|
99
|
-
_parser.string = xml
|
100
|
-
doc = LibXML::XML::Document.new()
|
101
|
-
doc = _parser.parse
|
102
|
-
rescue
|
103
|
-
begin
|
104
|
-
require 'rexml/document'
|
105
|
-
doc = REXML::Document.new(xml)
|
106
|
-
rescue
|
107
|
-
#likely some kind of xml error
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
83
|
+
doc = Nokogiri::XML(xml)
|
111
84
|
namespaces = {'n0' => 'http://www.w3.org/2005/Atom',
|
112
85
|
'opensearch' => 'http://a9.com/-/spec/opensearch/1.1/'
|
113
86
|
}
|
114
87
|
|
115
88
|
|
116
89
|
@header = {}
|
117
|
-
@header["totalResults"] =
|
118
|
-
@header["startIndex"] =
|
119
|
-
@header["itemsPerPage"] =
|
90
|
+
@header["totalResults"] = doc.xpath("//opensearch:totalResults").text
|
91
|
+
@header["startIndex"] = doc.xpath("//opensearch:startIndex").text
|
92
|
+
@header["itemsPerPage"] = doc.xpath("//opensearch:itemsPerPage").text
|
120
93
|
|
121
|
-
nodes =
|
94
|
+
nodes = doc.xpath("//*[local-name()='entry']")
|
122
95
|
nodes.each { |item |
|
123
96
|
_author = []
|
124
|
-
_title =
|
125
|
-
_tmpauthor =
|
97
|
+
_title = item.xpath("*[local-name() = 'title'][position()=1]").text
|
98
|
+
_tmpauthor = item.xpath("*[local-name() = 'author'][position()=1]")
|
126
99
|
|
127
100
|
if _tmpauthor != nil
|
128
|
-
if
|
129
|
-
|
130
|
-
_author.push(
|
101
|
+
if item.xpath("*[local-name() = 'author']/*[local-name() = 'name']") != nil
|
102
|
+
item.xpath("*[local-name() = 'author']/*[local-name() = 'name']").each { |i|
|
103
|
+
_author.push(i.text)
|
131
104
|
}
|
132
105
|
end
|
133
106
|
end
|
134
107
|
|
135
|
-
if
|
136
|
-
_link =
|
108
|
+
if item.xpath("*[local-name() = 'id']") != nil
|
109
|
+
_link = item.xpath("*[local-name() = 'id']").text
|
137
110
|
end
|
138
111
|
|
139
112
|
if _link != ''
|
140
113
|
_id = _link.slice(_link.rindex("/")+1, _link.length-_link.rindex("/"))
|
141
114
|
end
|
142
|
-
if
|
143
|
-
_citation =
|
115
|
+
if item.xpath("*[local-name() = 'content']") != nil
|
116
|
+
_citation = item.xpath("*[local-name() = 'content'][position()=1]").text
|
144
117
|
end
|
145
118
|
|
146
|
-
if
|
147
|
-
_summary =
|
119
|
+
if item.xpath("*[local-name() = 'summary']") != nil
|
120
|
+
_summary = item.xpath("*[local-name() = 'summary'][position()=1]").text
|
148
121
|
end
|
149
122
|
_rechash = {:title => _title, :author => _author, :link => _link, :id => _id, :citation => _citation,
|
150
123
|
:summary => _summary, :xml => item.to_s}
|
data/lib/wcapi/record.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module WCAPI
|
2
2
|
class SruSearchResponse
|
3
|
-
include WCAPI::XPath
|
3
|
+
#include WCAPI::XPath
|
4
4
|
attr_accessor :header, :records, :raw
|
5
5
|
|
6
6
|
def initialize(doc)
|
@@ -25,43 +25,38 @@ module WCAPI
|
|
25
25
|
|
26
26
|
xml = xml.gsub('<?xml-stylesheet type="text/xsl" href="/webservices/catalog/xsl/searchRetrieveResponse.xsl"?>', "")
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
@header["numberOfRecords"] = xpath_get_text(xpath_first(doc, "//numberOfRecords"))
|
36
|
-
@header["recordSchema"] = xpath_get_text(xpath_first(doc, "//recordSchema"))
|
37
|
-
@header["nextRecordPosition"] = xpath_get_text(xpath_first(doc, "//nextRecordPosition"))
|
38
|
-
@header["maxiumumRecords"] = xpath_get_text(xpath_first(doc, "//maximumRecords"))
|
39
|
-
@header["startRecord"] = xpath_get_text(xpath_first(doc, "//startRecord"))
|
28
|
+
doc = Nokogiri::XML(xml)
|
29
|
+
doc.remove_namespaces!
|
30
|
+
@header["numberOfRecords"] = doc.xpath("//numberOfRecords").text
|
31
|
+
@header["recordSchema"] = doc.xpath("//recordSchema").text
|
32
|
+
@header["nextRecordPosition"] = doc.xpath("//nextRecordPosition").text
|
33
|
+
@header["maxiumumRecords"] = doc.xpath("//maximumRecords").text
|
34
|
+
@header["startRecord"] = doc.xpath("//startRecord").text
|
40
35
|
|
41
|
-
nodes =
|
36
|
+
nodes = doc.xpath("//records/record/recordData/record")
|
42
37
|
nodes.each { |item |
|
43
|
-
_title =
|
44
|
-
if
|
45
|
-
|
46
|
-
_author.push(
|
38
|
+
_title = item.xpath("datafield[@tag='245']/subfield[@code='a'][position()=1]").text
|
39
|
+
if item.xpath("datafield[@tag='1*']") != nil
|
40
|
+
item.xpath("datafield[@tag='1*']/sufield[@code='a']").each { |i|
|
41
|
+
_author.push(i.text)
|
47
42
|
}
|
48
43
|
end
|
49
|
-
if
|
50
|
-
|
51
|
-
_author.push(
|
44
|
+
if item.xpath("datafield[@tag='7*']") != nil
|
45
|
+
item.xpath("datafield[@tag='7*']/sufield[@code='a']").each { |i|
|
46
|
+
_author.push(i.text)
|
52
47
|
}
|
53
48
|
end
|
54
49
|
|
55
|
-
if
|
56
|
-
_id =
|
50
|
+
if item.xpath("controlfield[@tag='001']") != nil
|
51
|
+
_id = item.xpath("controlfield[@tag='001'][position()=1]").text
|
57
52
|
_link = 'http://www.worldcat.org/oclc/' + _id.to_s
|
58
53
|
end
|
59
54
|
|
60
|
-
if
|
61
|
-
_summary =
|
55
|
+
if item.xpath("datafield[@tag='520']") != nil
|
56
|
+
_summary = item.xpath("datafield[@tag='520']/subfield[@code='a'][position()=1]").text
|
62
57
|
else
|
63
|
-
if
|
64
|
-
_summary =
|
58
|
+
if item.xpath("datafield[@tag='500']") != nil
|
59
|
+
_summary = item.xpath("datafield[@tag='500']/subfield[@code='a'][position()=1]").text
|
65
60
|
end
|
66
61
|
end
|
67
62
|
|
data/test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'wcapi'
|
3
3
|
|
4
|
-
client = WCAPI::Client.new :wskey => '
|
4
|
+
client = WCAPI::Client.new :wskey => '[your_key_here]'
|
5
5
|
|
6
6
|
response = client.OpenSearch(:q=>'building digital libraries', :format=>'atom', :start => '1', :count => '25', :cformat => 'all')
|
7
7
|
|
@@ -44,7 +44,7 @@ puts "\n\n"
|
|
44
44
|
|
45
45
|
puts "\n\n\n"
|
46
46
|
puts "SRU Search Example: " + "\n\n"
|
47
|
-
records = client.SRUSearch(:query => "civil war")
|
47
|
+
records = client.SRUSearch(:query => '"civil war"')
|
48
48
|
puts "Total Records: " + records.header["numberOfRecords"] + "\n"
|
49
49
|
records.records.each {|rec|
|
50
50
|
puts "Title: " + rec[:title] + "\n"
|
metadata
CHANGED
@@ -1,61 +1,52 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: wcapi
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Terry Reese
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-03-12 00:00:00 -07:00
|
13
|
-
default_executable:
|
11
|
+
date: 2014-02-03 00:00:00.000000000 Z
|
14
12
|
dependencies: []
|
15
|
-
|
16
13
|
description:
|
17
|
-
email:
|
14
|
+
email: reese.2179@osu.edu
|
18
15
|
executables: []
|
19
|
-
|
20
16
|
extensions: []
|
21
|
-
|
22
17
|
extra_rdoc_files: []
|
23
|
-
|
24
|
-
|
25
|
-
- lib/wcapi
|
26
|
-
- lib/wcapi/xpath.rb
|
27
|
-
- lib/wcapi/record.rb
|
28
|
-
- lib/wcapi/get_location_response.rb
|
29
|
-
- lib/wcapi/open_search_response.rb
|
18
|
+
files:
|
19
|
+
- lib/wcapi.rb
|
30
20
|
- lib/wcapi/client.rb
|
21
|
+
- lib/wcapi/get_location_response.rb
|
31
22
|
- lib/wcapi/get_record_response.rb
|
23
|
+
- lib/wcapi/open_search_response.rb
|
24
|
+
- lib/wcapi/record.rb
|
32
25
|
- lib/wcapi/sru_search_response.rb
|
33
|
-
-
|
34
|
-
has_rdoc: false
|
26
|
+
- test.rb
|
35
27
|
homepage:
|
28
|
+
licenses:
|
29
|
+
- Public Domain
|
30
|
+
metadata: {}
|
36
31
|
post_install_message:
|
37
32
|
rdoc_options: []
|
38
|
-
|
39
|
-
require_paths:
|
33
|
+
require_paths:
|
40
34
|
- lib
|
41
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
-
requirements:
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
43
37
|
- - ">="
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
46
|
-
|
47
|
-
|
48
|
-
requirements:
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
49
42
|
- - ">="
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version:
|
52
|
-
version:
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
53
45
|
requirements: []
|
54
|
-
|
55
46
|
rubyforge_project:
|
56
|
-
rubygems_version:
|
47
|
+
rubygems_version: 2.2.1
|
57
48
|
signing_key:
|
58
|
-
specification_version:
|
49
|
+
specification_version: 4
|
59
50
|
summary: Ruby component for processing the WorldCat API
|
60
|
-
test_files:
|
51
|
+
test_files:
|
61
52
|
- test.rb
|
data/lib/wcapi/xpath.rb
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
require 'rexml/xpath'
|
2
|
-
|
3
|
-
module WCAPI
|
4
|
-
module XPath
|
5
|
-
# get all matching nodes
|
6
|
-
def xpath_all(pdoc, path, namespace = '')
|
7
|
-
case parser_type(pdoc)
|
8
|
-
when 'libxml'
|
9
|
-
if namespace!=""
|
10
|
-
return pdoc.find(path, namespace) if pdoc.find(path, namespace)
|
11
|
-
else
|
12
|
-
return pdoc.find(path) if pdoc.find(path)
|
13
|
-
end
|
14
|
-
when 'rexml'
|
15
|
-
if namespace!=""
|
16
|
-
return REXML::XPath.match(pdoc, path, namespace)
|
17
|
-
else
|
18
|
-
return REXML::XPath.match(pdoc, path);
|
19
|
-
end
|
20
|
-
end
|
21
|
-
return []
|
22
|
-
end
|
23
|
-
|
24
|
-
# get first matching node
|
25
|
-
def xpath_first(doc, path, pnamespace = '')
|
26
|
-
begin
|
27
|
-
elements = xpath_all(doc, path, pnamespace)
|
28
|
-
if elements != nil
|
29
|
-
case parser_type(doc)
|
30
|
-
when 'libxml'
|
31
|
-
return elements.first
|
32
|
-
when 'rexml'
|
33
|
-
return elements[0]
|
34
|
-
else
|
35
|
-
return nil
|
36
|
-
end
|
37
|
-
else
|
38
|
-
return nil
|
39
|
-
end
|
40
|
-
rescue
|
41
|
-
return nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# get text for first matching node
|
46
|
-
def xpath(pdoc, path, namespace = '')
|
47
|
-
el = xpath_first(pdoc, path, namespace)
|
48
|
-
return unless el
|
49
|
-
case parser_type(pdoc)
|
50
|
-
when 'libxml'
|
51
|
-
return el.content
|
52
|
-
when 'rexml'
|
53
|
-
return el.text
|
54
|
-
end
|
55
|
-
return nil
|
56
|
-
end
|
57
|
-
|
58
|
-
# get text for element)
|
59
|
-
def xpath_get_text(doc)
|
60
|
-
begin
|
61
|
-
case parser_type(doc)
|
62
|
-
when 'libxml'
|
63
|
-
if doc.text? == false
|
64
|
-
return doc.content
|
65
|
-
else
|
66
|
-
return ""
|
67
|
-
end
|
68
|
-
when 'rexml'
|
69
|
-
if doc.has_text? == true
|
70
|
-
return doc.text
|
71
|
-
else
|
72
|
-
return ""
|
73
|
-
end
|
74
|
-
end
|
75
|
-
rescue
|
76
|
-
return ""
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# get text for element)
|
81
|
-
def xpath_get_all_text(doc)
|
82
|
-
begin
|
83
|
-
case parser_type(doc)
|
84
|
-
when 'libxml'
|
85
|
-
return doc.content
|
86
|
-
when 'rexml'
|
87
|
-
return doc.text
|
88
|
-
end
|
89
|
-
rescue
|
90
|
-
return nil
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# get node/element name
|
95
|
-
def xpath_get_name(doc)
|
96
|
-
begin
|
97
|
-
case parser_type(doc)
|
98
|
-
when 'libxml'
|
99
|
-
if doc.name != 'text'
|
100
|
-
return doc.name
|
101
|
-
else
|
102
|
-
return nil
|
103
|
-
end
|
104
|
-
when 'rexml'
|
105
|
-
return doc.name
|
106
|
-
end
|
107
|
-
rescue
|
108
|
-
return nil
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
# figure out an attribute
|
114
|
-
def get_attribute(node, attr_name)
|
115
|
-
case node.class.to_s
|
116
|
-
when 'REXML::XML::Element'
|
117
|
-
return node.attribute(attr_name)
|
118
|
-
when 'LibXML::XML::Node'
|
119
|
-
#There has been a method shift between 0.5 and 0.7
|
120
|
-
if defined?(node.property) == nil
|
121
|
-
return node.attributes[attr_name]
|
122
|
-
else
|
123
|
-
if defined?(node[attr_name])
|
124
|
-
return node[attr_name]
|
125
|
-
else
|
126
|
-
return node.property(attr_name)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
return nil
|
131
|
-
end
|
132
|
-
|
133
|
-
private
|
134
|
-
|
135
|
-
# figure out what sort of object we should do xpath on
|
136
|
-
def parser_type(x)
|
137
|
-
case x.class.to_s
|
138
|
-
when 'LibXML::XML::Document'
|
139
|
-
return 'libxml'
|
140
|
-
when 'LibXML::XML::Node'
|
141
|
-
return 'libxml'
|
142
|
-
when 'LibXML::XML::Node::Set'
|
143
|
-
return 'libxml'
|
144
|
-
when 'REXML::Element'
|
145
|
-
return 'rexml'
|
146
|
-
when 'REXML::Document'
|
147
|
-
return 'rexml'
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|