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 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
- begin
22
- require 'xml/libxml'
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 = xpath_get_text(xpath_first(item, "institutionIdentifier/value"))
24
+ _oclc_symbol = item.xpath("institutionIdentifier/value[position()=1]").text
39
25
 
40
- if xpath_first(item, "electronicAddress/text") != nil
41
- _link = xpath_get_text(xpath_first(item, "electronicAddress/text"))
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
- begin
25
- require 'rexml/document'
26
- doc = REXML::Document.new(xml)
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
- _title = xpath_get_text(xpath_first(item, "datafield[@tag='245']/subfield[@code='a']"))
35
- puts "TITLE: " + _title
36
- if xpath_first(item, "datafield[@tag='1*']") != nil
37
- xpath_all(item, "datafield[@tag='1*']/sufield[@code='a']").each { |i|
38
- _author.push(xpath_get_text(i))
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 xpath_first(item, "controlfield[@tag='001']") != nil
48
- _id = xpath_get_text(xpath_first(item, "controlfield[@tag='001']"))
49
- _link = 'http://www.worldcat.org/oclc/' + _id.to_s
50
- end
51
-
52
- if xpath_first(item, "datafield[@tag='520']") != nil
53
- _summary = xpath_get_text(xpath_first(item, "datafield[@tag='520']/subfield[@code='a']"))
54
- else
55
- if xpath_first(item, "datafield[@tag='500']") != nil
56
- _summary = xpath_get_text(xpath_first(item, "datafield[@tag='500']/subfield[@code='a']"))
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
- begin
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"] = xpath_get_text(xpath_first(doc, "//opensearch:totalResults"))
52
- @header["startIndex"] = xpath_get_text(xpath_first(doc, "//opensearch:startIndex"))
53
- @header["itemsPerPage"] = xpath_get_text(xpath_first(doc, "//opensearch: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 = xpath_all(doc, "//item", namespaces)
42
+ nodes = doc.xpath("//item", namespaces)
56
43
  nodes.each { |item |
57
- _title = xpath_get_text(xpath_first(item, "title"))
58
- if xpath_first(item, "author/name", namespaces) != nil
59
- xpath_all(item, "author/name", namespaces).each { |i|
60
- _author.push(xpath_get_text(i))
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 xpath_first(item, "link", namespaces) != nil
64
- _link = xpath_get_text(xpath_first(item, "link", namespaces))
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 xpath_first(item, "content:encoded", namespaces) != nil
71
- _citation = xpath_get_text(xpath_first(item, "content:encoded", namespaces))
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 xpath_first(item, "description", namespaces) != nil
75
- _summary = xpath_get_text(xpath_first(item, "description", namespaces))
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
- begin
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"] = xpath_get_text(xpath_first(doc, "//opensearch:totalResults"))
118
- @header["startIndex"] = xpath_get_text(xpath_first(doc, "//opensearch:startIndex"))
119
- @header["itemsPerPage"] = xpath_get_text(xpath_first(doc, "//opensearch: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 = xpath_all(doc, "//*[local-name()='entry']")
94
+ nodes = doc.xpath("//*[local-name()='entry']")
122
95
  nodes.each { |item |
123
96
  _author = []
124
- _title = xpath_get_text(xpath_first(item, "*[local-name() = 'title']"))
125
- _tmpauthor = xpath_first(item, "*[local-name() = 'author']")
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 xpath_first(item, "*[local-name() = 'author']/*[local-name() = 'name']") != nil
129
- xpath_all(item, "*[local-name() = 'author']/*[local-name() = 'name']").each { |i|
130
- _author.push(xpath_get_text(i))
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 xpath_first(item, "*[local-name() = 'id']") != nil
136
- _link = xpath_get_text(xpath_first(item, "*[local-name() = 'id']"))
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 xpath_first(item, "*[local-name() = 'content']") != nil
143
- _citation = xpath_get_text(xpath_first(item, "*[local-name() = 'content']"))
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 xpath_first(item, "*[local-name() = 'summary']") != nil
147
- _summary = xpath_get_text(xpath_first(item, "*[local-name() = '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,7 +1,7 @@
1
1
  module WCAPI
2
2
 
3
3
  class Record
4
- include WCAPI::XPath
4
+ #include WCAPI::XPath
5
5
  attr_accessor :title, :author, :link, :id, :citation, :summary, :xml
6
6
 
7
7
  def initialize(pxml)
@@ -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
- begin
29
- require 'rexml/document'
30
- doc = REXML::Document.new(xml)
31
- rescue
32
- #likely some kind of xml error
33
- end
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 = xpath_all(doc, "//records/record/recordData/record")
36
+ nodes = doc.xpath("//records/record/recordData/record")
42
37
  nodes.each { |item |
43
- _title = xpath_get_text(xpath_first(item, "datafield[@tag='245']/subfield[@code='a']"))
44
- if xpath_first(item, "datafield[@tag='1*']") != nil
45
- xpath_all(item, "datafield[@tag='1*']/sufield[@code='a']").each { |i|
46
- _author.push(xpath_get_text(i))
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 xpath_first(item, "datafield[@tag='7*']" ) != nil
50
- xpath_all(item, "datafield[@tag='7*']/sufield[@code='a']").each { |i|
51
- _author.push(xpath_get_text(i))
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 xpath_first(item, "controlfield[@tag='001']") != nil
56
- _id = xpath_get_text(xpath_first(item, "controlfield[@tag='001']"))
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 xpath_first(item, "datafield[@tag='520']") != nil
61
- _summary = xpath_get_text(xpath_first(item, "datafield[@tag='520']/subfield[@code='a']"))
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 xpath_first(item, "datafield[@tag='500']") != nil
64
- _summary = xpath_get_text(xpath_first(item, "datafield[@tag='500']/subfield[@code='a']"))
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 => 'PYNtMxToldTvjQdsCUPqph5WPv2jnXX4IICzKZmILTHZRQ42JslUTz7Q6ngC4P1UVEkpyZ9XHbIGlfMX'
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.1
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: terry.reese@oregonstate.edu
14
+ email: reese.2179@osu.edu
18
15
  executables: []
19
-
20
16
  extensions: []
21
-
22
17
  extra_rdoc_files: []
23
-
24
- files:
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
- - lib/wcapi.rb
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: "0"
46
- version:
47
- required_rubygems_version: !ruby/object:Gem::Requirement
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: "0"
52
- version:
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
53
45
  requirements: []
54
-
55
46
  rubyforge_project:
56
- rubygems_version: 1.3.1
47
+ rubygems_version: 2.2.1
57
48
  signing_key:
58
- specification_version: 2
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