code: def unparse(input_dict, output=None, encoding='utf-8', full_document=True,
              short_empty_elements=False,
              **kwargs):
      
      if full_document and len(input_dict) != 1:
          raise ValueError('Document must have exactly one root.')
      must_return = False
      if output is None:
          output = StringIO()
          must_return = True
      if short_empty_elements:
          content_handler = XMLGenerator(output, encoding, True)
      else:
          content_handler = XMLGenerator(output, encoding)
      if full_document:
          content_handler.startDocument()
      for key, value in input_dict.items():
          _emit(key, value, content_handler, full_document=full_document,
                **kwargs)
      if full_document:
          content_handler.endDocument()
      if must_return:
          value = output.getvalue()
          try:  # pragma no cover
              value = value.decode(encoding)
          except AttributeError:  # pragma no cover
              pass
          return value
docs: Emit an XML document for the given `input_dict` (reverse of `parse`).
  
      The resulting XML document is returned as a string, but if `output` (a
      file-like object) is specified, it is written there instead.
  
      Dictionary keys prefixed with `attr_prefix` (default=`'@'`) are interpreted
      as XML node attributes, whereas keys equal to `cdata_key`
      (default=`'#text'`) are treated as character data.
  
      The `pretty` parameter (default=`False`) enables pretty-printing. In this
      mode, lines are terminated with `'\n'` and indented with `'\t'`, but this
      can be customized with the `newl` and `indent` parameters.