Update the contents of this instance based on the given XML. Accepts the following options:
Proc or Hash that accepts a string and returns a string, used to convert tag names to column or association names.
Sets the :name_proc option to one that calls underscore
on the
input string. Requires that you load the inflector extension or another
library that adds String#underscore.
# File lib/sequel/plugins/xml_serializer.rb, line 210 def from_xml(xml, opts=OPTS) from_xml_node(Nokogiri::XML(xml).children.first, opts) end
Update the contents of this instance based on the given XML node, which should be a Nokogiri::XML::Node instance. By default, just calls set with a hash created from the content of the node.
Options:
Indicates that the associations cache should be updated by creating a new associated object using data from the hash. Should be a Symbol for a single association, an array of symbols for multiple associations, or a hash with symbol keys and dependent association option hash values.
Changes the behavior to call set_fields using the provided fields, instead of calling set.
# File lib/sequel/plugins/xml_serializer.rb, line 224 def from_xml_node(parent, opts=OPTS) unless parent raise Error, "Malformed XML used" end if !parent.children.empty? && parent.children.all?{|node| node.is_a?(Nokogiri::XML::Text)} raise Error, "XML consisting of just text nodes used" end if assocs = opts[:associations] assocs = case assocs when Symbol {assocs=>{}} when Array assocs_tmp = {} assocs.each{|v| assocs_tmp[v] = {}} assocs_tmp when Hash assocs else raise Error, ":associations should be Symbol, Array, or Hash if present" end assocs_hash = {} assocs.each{|k,v| assocs_hash[k.to_s] = v} assocs_present = [] end hash = {} populate_associations = {} name_proc = model.xml_deserialize_name_proc(opts) parent.children.each do |node| next if node.is_a?(Nokogiri::XML::Text) k = name_proc[node.name] if assocs_hash && assocs_hash[k] assocs_present << [k.to_sym, node] else hash[k] = node.key?('nil') ? nil : node.children.first.to_s end end if assocs_present assocs_present.each do |assoc, node| assoc_opts = assocs[assoc] unless r = model.association_reflection(assoc) raise Error, "Association #{assoc} is not defined for #{model}" end populate_associations[assoc] = if r.returns_array? node.children.reject{|c| c.is_a?(Nokogiri::XML::Text)}.map{|c| r.associated_class.from_xml_node(c, assoc_opts)} else r.associated_class.from_xml_node(node, assoc_opts) end end end if fields = opts[:fields] set_fields(hash, fields, opts) else set(hash) end populate_associations.each do |assoc, values| associations[assoc] = values end self end
Return a string in XML format. If a block is given, yields the XML builder object so you can add additional XML tags. Accepts the following options:
The builder instance used to build the XML, which should be an instance of Nokogiri::XML::Node. This is necessary if you are serializing entire object graphs, like associated objects.
Options to pass to the Nokogiri::XML::Builder initializer, if the :builder option is not provided.
Sets the :name_proc option to one that calls camelize
on the
input string. Requires that you load the inflector extension or another
library that adds String#camelize.
Sets the :name_proc option to one that calls dasherize
on the
input string. Requires that you load the inflector extension or another
library that adds String#dasherize.
The encoding to use for the XML output, passed to the Nokogiri::XML::Builder initializer.
Symbol or Array of Symbols of columns not to include in the XML output.
Symbol, Array of Symbols, or a Hash with Symbol keys and Hash values specifying associations or other non-column attributes to include in the XML output. Using a nested hash, you can pass options to associations to affect the XML used for associated objects.
Proc or Hash that accepts a string and returns a string, used to format tag names.
Symbol or Array of Symbols of columns to only include in the JSON output, ignoring all other columns.
The base name to use for the XML tag that contains the data for this instance. This will be the name of the root node if you are only serializing a single object, but not if you are serializing an array of objects using Model.to_xml or Dataset#to_xml.
Set to true to include type information for all of the columns, pulled from the db_schema.
# File lib/sequel/plugins/xml_serializer.rb, line 331 def to_xml(opts=OPTS) vals = values types = opts[:types] inc = opts[:include] cols = if only = opts[:only] Array(only) else vals.keys - Array(opts[:except]) end name_proc = model.xml_serialize_name_proc(opts) x = model.xml_builder(opts) x.send(name_proc[opts.fetch(:root_name, model.send(:underscore, model.name).gsub('/', '__')).to_s]) do |x1| cols.each do |c| attrs = {} if types attrs[:type] = db_schema.fetch(c, {})[:type] end v = vals[c] if v.nil? attrs[:nil] = '' end x1.send(name_proc[c.to_s], v, attrs) end if inc.is_a?(Hash) inc.each{|k, v| to_xml_include(x1, k, v)} else Array(inc).each{|i| to_xml_include(x1, i)} end yield x1 if block_given? end x.to_xml end
Handle associated objects and virtual attributes when creating the xml.
# File lib/sequel/plugins/xml_serializer.rb, line 370 def to_xml_include(node, i, opts=OPTS) name_proc = model.xml_serialize_name_proc(opts) objs = send(i) if objs.is_a?(Array) && objs.all?{|x| x.is_a?(Sequel::Model)} node.send(name_proc[i.to_s]) do |x2| objs.each{|obj| obj.to_xml(opts.merge(:builder=>x2))} end elsif objs.is_a?(Sequel::Model) objs.to_xml(opts.merge(:builder=>node, :root_name=>i)) else node.send(name_proc[i.to_s], objs) end end