Skip to content

Instantly share code, notes, and snippets.

@lanrion
Last active August 29, 2015 13:58
Show Gist options
  • Select an option

  • Save lanrion/9967961 to your computer and use it in GitHub Desktop.

Select an option

Save lanrion/9967961 to your computer and use it in GitHub Desktop.
multi_xml适配器模式的实现

摘自 multi_xml 适配器模式的实现,加载某个gem正常,则相应的使用某个解释器来解释XML

# Get the current parser class.
def parser
  return @parser if defined?(@parser)
  self.parser = self.default_parser
  @parser
end

# The default parser based on what you currently
# have loaded and installed. First checks to see
# if any parsers are already loaded, then checks
# to see which are installed if none are loaded.
def default_parser
  return :ox if defined?(::Ox)
  return :libxml if defined?(::LibXML)
  return :nokogiri if defined?(::Nokogiri)

  REQUIREMENT_MAP.each do |library, parser|
    begin
      require library
      return parser
    rescue LoadError
      next
    end
  end
end

# Set the XML parser utilizing a symbol, string, or class.
# Supported by default are:
#
# * <tt>:libxml</tt>
# * <tt>:nokogiri</tt>
# * <tt>:ox</tt>
# * <tt>:rexml</tt>
def parser=(new_parser)
  case new_parser
  when String, Symbol
    require "multi_xml/parsers/#{new_parser.to_s.downcase}"
    @parser = MultiXml::Parsers.const_get("#{new_parser.to_s.split('_').map{|s| s.capitalize}.join('')}")
  when Class, Module
    @parser = new_parser
  else
    raise "Did not recognize your parser specification. Please specify either a symbol or a class."
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment