'dn
string-representation of distinguished name
entry
dictionary holding the LDAP entry {attr:data}'

def writeRecord(self, dn, entry):

    self._output_file.write(('%s<dsml:entry    dn="%s">\n' % ((self._indent * 2), replace_char(dn))))
    objectclasses = entry.get('objectclass', entry.get('objectClass', []))
    self._output_file.write(('%s<dsml:objectclass>\n' % (self._indent * 3)))
    for oc in objectclasses:
        self._output_file.write(('%s<dsml:oc-value>%s</dsml:oc-value>\n' % ((self._indent * 4), oc)))
    self._output_file.write(('%s</dsml:objectclass>\n' % (self._indent * 3)))
    attr_types = entry.keys()[:]
    try:
        attr_types.remove('objectclass')
        attr_types.remove('objectClass')
    except ValueError:
        pass
    attr_types.sort()
    for attr_type in attr_types:
        self._output_file.write(('%s<dsml:attr    name="%s">\n' % ((self._indent * 3), attr_type)))
        for attr_value_item in entry[attr_type]:
            needs_base64_encoding = self._needs_base64_encoding(attr_type, attr_value_item)
            if needs_base64_encoding:
                attr_value_item = base64.encodestring(attr_value_item)
            else:
                attr_value_item = replace_char(attr_value_item)
            self._output_file.write(('%s<dsml:value%s>\n' % ((self._indent * 4), ('    encoding="base64"' * needs_base64_encoding))))
            self._output_file.write(('%s%s\n' % ((self._indent * 5), attr_value_item)))
            self._output_file.write(('%s</dsml:value>\n' % ((self._indent * 4),)))
        self._output_file.write(('%s</dsml:attr>\n' % (self._indent * 3)))
    self._output_file.write(('%s</dsml:entry>\n' % (self._indent * 2)))
    return
