Class/Module Index [+]

Quicksearch

FeedTools::XmlHelper

Generic xml methods needed in numerous places throughout FeedTools

Public Class Methods

combine_xpaths_all(element, xpath_list, options={}) click to toggle source

Runs through a list of XPath queries on an element or document and returns all non-empty results, appending the results from each query onto the end of the results from the previous queries.

# File lib/feed_tools/helpers/xml_helper.rb, line 181
def self.combine_xpaths_all(element, xpath_list, options={})
  FeedTools::GenericHelper.validate_options([ :select_result_value ],
                   options.keys)
  options = { :select_result_value => false }.merge(options)

  all_results = []
  result = []
  if element.nil?
    return []
  end
  for xpath in xpath_list
    # Namespace aware
    results = REXML::XPath.liberal_match(element, xpath,
      FEED_TOOLS_NAMESPACES)
    if options[:select_result_value] && !results.nil? && !results.empty?
      results =
        results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
    end
    if results.blank?
      results = REXML::XPath.liberal_match(element, xpath)
    else
      all_results.concat(results)
      next
    end

    # Namespace unaware
    if options[:select_result_value] && !results.nil? && !results.empty?
      results =
        results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
    end
    if !results.blank?
      all_results.concat(results)
      next
    end
  end
  for xpath in xpath_list
    if xpath =~ /^\w+$/
      results = []
      for child in element.children
        if child.class == REXML::Element
          if child.name.downcase == xpath.downcase
            results << child
          end
        end
      end
      if options[:select_result_value] && !results.nil? && !results.empty?
        results =
          results.map { |x| x.inner_xml }
      end
      if !results.blank?
        all_results.concat(results)
        next
      end
    end
  end
  return all_results.uniq
end
select_not_blank(results, &block) click to toggle source

Selects the first non-blank result.

# File lib/feed_tools/helpers/xml_helper.rb, line 32
def self.select_not_blank(results, &block)
  if results.kind_of? Array
    for result in results
      blank_result = false
      if !block.nil?
        blank_result = block.call(result)
      else
        blank_result = result.to_s.blank?
      end
      unless result.nil? || blank_result
        return result
      end
    end
  else
    blank_result = false
    if !block.nil?
      blank_result = block.call(results)
    else
      blank_result = results.to_s.blank?
    end
    unless results.nil? || blank_result
      return results
    end
  end
  return nil
end
try_xpaths(element, xpath_list, options={}, &block) click to toggle source

Runs through a list of XPath queries on an element or document and returns the first non-blank result. Subsequent XPath queries will not be evaluated.

# File lib/feed_tools/helpers/xml_helper.rb, line 62
def self.try_xpaths(element, xpath_list,
    options={}, &block)
  FeedTools::GenericHelper.validate_options([ :select_result_value ],
                   options.keys)
  options = { :select_result_value => false }.merge(options)

  result = nil
  if element.nil?
    return nil
  end
  for xpath in xpath_list
    # Namespace aware
    result = REXML::XPath.liberal_first(element, xpath,
      FEED_TOOLS_NAMESPACES)
    if options[:select_result_value] && !result.nil?
      if result.respond_to?(:value)
        result = result.value
      else
        result = result.to_s
      end
    end
    blank_result = false
    if block_given?
      blank_result = yield(result)
    else
      blank_result = result.to_s.blank?
    end
    if !blank_result
      if result.respond_to? :strip
        result.strip!
      end
      return result
    end
    
    # Namespace unaware
    result = REXML::XPath.liberal_first(element, xpath)
    if options[:select_result_value] && !result.nil?
      if result.respond_to?(:value)
        result = result.value
      else
        result = result.to_s
      end
    end
    blank_result = false
    if block_given?
      blank_result = yield(result)
    else
      blank_result = result.to_s.blank?
    end
    if !blank_result
      if result.respond_to? :strip
        result.strip!
      end
      return result
    end
  end
  return nil
end
try_xpaths_all(element, xpath_list, options={}) click to toggle source

Runs through a list of XPath queries on an element or document and returns all non-empty results. Subsequent XPath queries will not be evaluated.

# File lib/feed_tools/helpers/xml_helper.rb, line 124
def self.try_xpaths_all(element, xpath_list, options={})
  FeedTools::GenericHelper.validate_options([ :select_result_value ],
                   options.keys)
  options = { :select_result_value => false }.merge(options)

  results = []
  if element.nil?
    return []
  end
  for xpath in xpath_list
    # Namespace aware
    results = REXML::XPath.liberal_match(element, xpath,
      FEED_TOOLS_NAMESPACES)
    if options[:select_result_value] && !results.nil? && !results.empty?
      results =
        results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
    end
    if results.blank?
      results = REXML::XPath.liberal_match(element, xpath)
    else
      return results
    end
    
    # Namespace unaware
    if options[:select_result_value] && !results.nil? && !results.empty?
      results =
        results.map { |x| x.respond_to?(:value) ? x.value : x.to_s }
    end
    if !results.blank?
      return results
    end
  end
  for xpath in xpath_list
    if xpath =~ /^\w+$/
      results = []
      for child in element.children
        if child.class == REXML::Element
          if child.name.downcase == xpath.downcase
            results << child
          end
        end
      end
      if options[:select_result_value] && !results.nil? && !results.empty?
        results =
          results.map { |x| x.inner_xml }
      end
      if !results.blank?
        return results
      end
    end
  end
  return []
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.