module Puree::XMLExtractor::Collection

Resource collection XML extractor.

Public Class Methods

count(xml) click to toggle source

Records available for a resource

# File lib/puree/xml_extractor/collection.rb, line 116
def self.count(xml)
  doc = Nokogiri::XML xml
  doc.remove_namespaces!
  doc.xpath('/result/count').text.to_i
end
datasets(xml) click to toggle source

Get models from any multi-record dataset XML response

@param xml [String] @return [Array<Puree::Model::Dataset>]

# File lib/puree/xml_extractor/collection.rb, line 13
def self.datasets(xml)
  models :dataset, xml, '/dataSet'
end
events(xml) click to toggle source

Get models from any multi-record event XML response

@param xml [String] @return [Array<Puree::Model::Event>]

# File lib/puree/xml_extractor/collection.rb, line 21
def self.events(xml)
  models :event, xml, '/event'
end
external_organisations(xml) click to toggle source

Get models from any multi-record external organisation XML response

@param xml [String] @return [Array<Puree::Model::ExternalOrganisation>]

# File lib/puree/xml_extractor/collection.rb, line 29
def self.external_organisations(xml)
  models :external_organisation, xml, '/externalOrganisation'
end
journals(xml) click to toggle source

Get models from any multi-record journal XML response

@param xml [String] @return [Array<Puree::Model::Journal>]

# File lib/puree/xml_extractor/collection.rb, line 37
def self.journals(xml)
  models :journal, xml, '/journal'
end
organisational_units(xml) click to toggle source

Get models from any multi-record organisation XML response

@param xml [String] @return [Array<Puree::Model::OrganisationalUnit>]

# File lib/puree/xml_extractor/collection.rb, line 45
def self.organisational_units(xml)
  models :organisational_unit, xml, '/organisationalUnit'
end
persons(xml) click to toggle source

Get models from any multi-record person XML response

@param xml [String] @return [Array<Puree::Model::Person>]

# File lib/puree/xml_extractor/collection.rb, line 61
def self.persons(xml)
  models :person, xml, '/person'
end
projects(xml) click to toggle source

Get models from any multi-record project XML response

@param xml [String] @return [Array<Puree::Model::Project>]

# File lib/puree/xml_extractor/collection.rb, line 53
def self.projects(xml)
  models :project, xml, '/project'
end
publishers(xml) click to toggle source

Get models from any multi-record person XML response

@param xml [String] @return [Array<Puree::Model::Publisher>]

# File lib/puree/xml_extractor/collection.rb, line 69
def self.publishers(xml)
  models :publisher, xml, '/publisher'
end
research_outputs(xml) click to toggle source

Get models from any multi-record Research output XML response

@param xml [String] @return [Hash{Symbol => Array<Puree::Model::ResearchOutput class/subclass>}]

# File lib/puree/xml_extractor/collection.rb, line 77
def self.research_outputs(xml)
  path_from_root = File.join 'result/items', '/*'
  doc = Nokogiri::XML xml
  doc.remove_namespaces!
  xpath_result = doc.xpath path_from_root
  data = {
      journal_articles: [],
      conference_papers: [],
      theses: [],
      other: []
  }
  xpath_result.each do |research_output|
    xpath_result_type = research_output.xpath('type/term/text')
    type = xpath_result_type.first.text.strip unless xpath_result_type.empty?
    if type
      case type
        when 'Journal article'
          extractor = Puree::XMLExtractor::JournalArticle.new research_output.to_s
          data[:journal_articles] << extractor.model
        when 'Conference paper'
          extractor = Puree::XMLExtractor::ConferencePaper.new research_output.to_s
          data[:conference_papers] << extractor.model
        when 'Doctoral Thesis'
          extractor = Puree::XMLExtractor::Thesis.new research_output.to_s
          data[:theses] << extractor.model
        when "Master's Thesis"
          extractor = Puree::XMLExtractor::Thesis.new research_output.to_s
          data[:theses] << extractor.model
        else
          extractor = Puree::XMLExtractor::ResearchOutput.new research_output.to_s
          data[:other] << extractor.model
      end
    end
  end
  data
end

Private Class Methods

make_xml_extractor(resource_type, xml) click to toggle source
# File lib/puree/xml_extractor/collection.rb, line 141
def self.make_xml_extractor(resource_type, xml)
  resource_class = "Puree::XMLExtractor::#{Puree::Util::String.titleize(resource_type)}"
  Object.const_get(resource_class).new xml
end
models(resource_type, xml, xpath_root) click to toggle source

Get models from any multi-record resource XML response

@param xml [String] @return [Array<Puree::Model::Resource subclass>]

# File lib/puree/xml_extractor/collection.rb, line 128
def self.models(resource_type, xml, xpath_root)
  doc = Nokogiri::XML xml
  doc.remove_namespaces!
  path_from_root = File.join 'result/items', xpath_root
  xpath_result = doc.xpath path_from_root
  data = []
  xpath_result.each do |i|
    xml_extractor = make_xml_extractor resource_type, i.to_s
    data << xml_extractor.model
  end
  data
end