'Get a string representation of this object.
@param indent: The indent.
@type indent: int
@return: A string.
@rtype: str'

def str(self, indent=0, history=None):

    if (history is None):
        history = []
    if (self in history):
        return ('%s    ...' % Repr(self))
    history.append(self)
    tab = ('%*s' % ((indent * 3), ''))
    result = []
    result.append(('%s<%s' % (tab, self.id)))
    for n in self.description():
        if (not hasattr(self, n)):
            continue
        v = getattr(self, n)
        if (v is None):
            continue
        result.append(('    %s="%s"' % (n, v)))
    if len(self):
        result.append('>')
        for c in self.rawchildren:
            result.append('\n')
            result.append(c.str((indent + 1), history[:]))
            if c.isattr():
                result.append('@')
        result.append(('\n%s' % tab))
        result.append(('</%s>' % self.__class__.__name__))
    else:
        result.append('    />')
    return ''.join(result)
