code: 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)
docs: Get a string representation of this object.
          @param indent: The indent.
          @type indent: int
          @return: A string.
          @rtype: str