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