wcapi 0.0.1 → 0.0.3

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 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