# File lib/soap/encodingstyle/literalHandler.rb, line 29
  def encode_data(generator, ns, data, parent)
    attrs = {}
    name = generator.encode_name(ns, data, attrs)
    data.extraattr.each do |key, value|
      next if !@generate_explicit_type and key == XSD::AttrTypeName
      keytag = key
      if key.is_a?(XSD::QName)
        keytag = encode_attr_key(attrs, ns, key)
      end
      if value.is_a?(XSD::QName)
        value = encode_qname(attrs, ns, value)
      end
      attrs[keytag] = value
    end
    case data
    when SOAPExternalReference
      # do not encode SOAPExternalReference in
      # literalHandler (which is used for literal service)
      data.referred
    when SOAPRawString
      generator.encode_tag(name, attrs)
      generator.encode_rawstring(data.to_s)
    when XSD::XSDString
      generator.encode_tag(name, attrs)
      str = decode_str(data.to_s)
      generator.encode_string(str)
    when XSD::XSDAnySimpleType
      generator.encode_tag(name, attrs)
      generator.encode_string(data.to_s)
    when SOAPStruct
      generator.encode_tag(name, attrs)
      data.each do |key, value|
        generator.encode_child(ns, value, data)
      end
    when SOAPArray
      generator.encode_tag(name, attrs)
      data.traverse do |child, *rank|
        data.position = nil
        generator.encode_child(ns, child, data)
      end
    when SOAPElement
      unless generator.use_default_namespace
        # passes 2 times for simplifying namespace definition
        data.each do |key, value|
          if value.elename.namespace
            Generator.assign_ns(attrs, ns, value.elename.namespace)
          end
        end
      end
      if data.text and data.text.is_a?(XSD::QName)
        Generator.assign_ns(attrs, ns, data.text.namespace)
      end
      generator.encode_tag(name, attrs)
      if data.text
        if data.text.is_a?(XSD::QName)
          text = ns.name(data.text)
        else
          text = data.text
        end
        generator.encode_string(text)
      end
      data.each do |key, value|
        generator.encode_child(ns, value, data)
      end
    else
      raise EncodingStyleError.new(
        "unknown object:#{data} in this encodingStyle")
    end
  end